首页 > 其他分享 >[Go Unit testing] Unit testing Go program

[Go Unit testing] Unit testing Go program

时间:2024-02-26 15:57:30浏览次数:24  
标签:Args return string nil testing Unit Go opts projector

Code: config.go

package projector

import (
	"fmt"
	"os"
	"path"
)

type Operation = int
const (
	Print Operation = iota
	Add
	Remove
)

type Config struct {
	Args []string
	Operation Operation
	Config string
	Pwd string
}

func getPwd(opts *Opts) (string, error) {
	if opts.Pwd != "" {
		return opts.Pwd, nil
	}

	return os.Getwd()
}

func getConfig(opts *Opts) (string, error) {
	if opts.Config != "" {
		return opts.Config, nil
	}

	config, err := os.UserConfigDir()
	if err != nil {
		return "", nil
	}

	return path.Join(config, "projector", "projector.json"), nil
}

func getOperation(opts *Opts) Operation {
	if len(opts.Args) == 0 {
		return Print
	}

	if opts.Args[0] == "add" {
		return Add
	}

	if opts.Args[0] == "rm" {
		return Remove
	}

	return Print
}

func getArgs(opts *Opts) ([]string, error) {
	if len(opts.Args) == 0 {
		return []string{}, nil
	}

	operation := getOperation(opts)

	if operation == Add {
		if len(opts.Args) != 3 {
			return nil, fmt.Errorf("add requries 2 arguments, but received %v", len(opts.Args) - 1)
		}
		return opts.Args[1:], nil
	}

	if operation == Remove {
		if len(opts.Args) != 2 {
			return nil, fmt.Errorf("remove requries 1 arguments, but received %v", len(opts.Args) -1)
		}
		return opts.Args[1:], nil
	}

	if len(opts.Args) > 1 {
			return nil, fmt.Errorf("print requries 0 or 1 arguments, but received %v", len(opts.Args))
	}

	return opts.Args, nil
}

func NewConfig(opts *Opts) (*Config, error) {
	pwd, err := getPwd(opts)
	if err != nil {
		return nil, err
	}

	config, err := getConfig(opts)
	if err != nil {
		return nil, err
	}

	args, err := getArgs(opts)
	if err != nil {
		return nil, err
	}

	return &Config{
		Pwd: pwd,
		Config: config,
		Args: args,
		Operation: getOperation(opts),
	}, nil
}

 

Testing code: config_test.go

package projector_test

import (
	"reflect"
	"testing"

	"github.com/zhen/projector/pkg/projector"
)

func testConfig(t *testing.T, args []string, expectedArgs []string, operation projector.Operation) {
	opts := getOpts(args)
	config, err := projector.NewConfig(opts)

	if err != nil {
		t.Errorf("expected to get no error %v", err)
	}

	if !reflect.DeepEqual(expectedArgs, config.Args) {
		t.Errorf("expected args to be %+v array but got %+v", expectedArgs, config.Args)
	}

	if config.Operation != operation {
		t.Errorf("operation expect was %v but got %v", operation, config.Operation)
	}
}

func getOpts(args []string) *projector.Opts {
	opts := &projector.Opts{
		Args: args,
		Config: "",
		Pwd: "",
	}
	return opts
}

func TestConfigPrint(t *testing.T) {
	testConfig(t, []string{}, []string{}, projector.Print)
}

func TestConfigPrintKey(t *testing.T) {
	testConfig(t, []string{"foo"}, []string{"foo"}, projector.Print)
}

func TestConfigAddKeyValue(t *testing.T) {
	testConfig(t, []string{"add", "foo", "bar"}, []string{"foo", "bar"}, projector.Add)
}

func TestConfigRmKey(t *testing.T) {
	testConfig(t, []string{"rm", "foo"}, []string{"foo"}, projector.Remove)
}

 

标签:Args,return,string,nil,testing,Unit,Go,opts,projector
From: https://www.cnblogs.com/Answer1215/p/18034499

相关文章

  • 基础知识-GO语言部分
    (240226)资料参考Go语言教程|runoobgolang的类型推断|jb51Golang-100-Days|Github|rubyhanGo语言基础之Context详解|zhihu|程序员祝融基础基本语法Go程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。fmt.Println("Hello,World!")6个标记......
  • Python Django适配dm8(达梦)数据库
    官方文档https://eco.dameng.com/document/dm/zh-cn/start/python-development.htmlDjango适配达梦https://blog.csdn.net/qq_35349982/article/details/132165581https://blog.csdn.net/weixin_61894388/article/details/126330168项目适配达梦升级或安装依赖Django==3......
  • go psutil获取磁盘信息
    示例代码://通过psutil获取所有分区的信息//重要字段:/*fmt.Printf("Device:%s\n",partition.Device)fmt.Printf("Mountpoint:%s\n",partition.Mountpoint)fmt.Printf("Filesystemtype:%s\n",partition.Fstype)fmt.Printf(......
  • 这3款免费最佳Google翻译替代品,完美解决谷歌翻译国内用不了的尴尬
    前段时间Google谷歌翻译停止了中国区服务,谷歌翻译退出中国已经成为历史事件,导致Chrome谷歌浏览器无法翻译网页,使得很多小伙伴办公和学习都遇到阻碍,目前搜索谷歌翻译的网址无法正常访问,甚至连谷歌翻译的手机APP也无法使用。谷歌在线翻译突然撤出中国,这猝不及防的操作瞬间让很......
  • make集成go语言项目
    参考下面这个makefile.PHONY:builddebugdlvcleantoollinthelpall:buildbuild: @gobuild-v.debug: gobuild-gcflags"all=-N-l"-v-oapp.dlv: dlv--listen=:2345--headless=true--api-version=2--accept-multiclientexec./apptool:......
  • go语言和bash中处理csv
    golang中处理csv标准库中csv文件的一些内容varfileio.Readerreader:=csv.NewReader(file)gocsv库他有以下特点:简单的api来将csv内容解析成go结构体自定义解析特定类型的函数;自定义csv的reader和writer基本使用:下面的代码可以将csv文本的内容解析到切片中;pa......
  • gogs修改gitclone 仓库地址
      查看gogsdocker容器的名称dockerps进入容器内部dockerexec-itd1bba9f39a02/bin/bash编辑gogs容器的配置文件 vi/data/gogs/conf/app.ini  [server]DOMAIN= gogs.ceshi.online   #这个是ssh的地址  HTTP_PORT=3000EXTERNAL_......
  • 运用 Argo Workflows 协调 CI/CD 流水线
    ArgoWorkflows是一个开源的容器原生工作流引擎,用于协调CI/CD在Kubernetes中的运作。它以Kubernetes自定义资源(CRD)的形式实现,使开发人员能够创建自定义API对象,以兼容的方式扩展Kubernetes的功能。 选择ArgoWorkflows的原因ArgoWorkflows旨在运行于Kubernetes......
  • 【Gorm 错误收集】Error 1215 (HY000): Cannot add foreign key constraint
    错误:Error1215(HY000):Cannotaddforeignkeyconstraint相关mysql错误:Error1215(HY000):Cannotaddforeignkeyconstraint。场景:为了方便测试人员测试产品的功能以及后续报告,PM设计了一个测试用例的功能,用于记录需要测试的产品的操作步骤。针对这个功能,我建立......
  • go 语言flag 库使用
    flag用于解析命令行选项,有过类Unix系统使用经验的童鞋对命令行选项应该不陌生,例如命令ls-al列出当前目录下所有文件和目录的详细信息,其中-al就是命令行选项。命令行选项在实际开发中很常用,特别是在写工具的时候。自定义某些参数,如python-mSimpleHTTPServer8080启动......