【发布时间】:2021-11-06 12:43:42
【问题描述】:
我试图捕捉一个错误并对特定的错误对象进行单元测试检查,这里是 prod 函数我正在测试:
const command = "/tmp/cmd"
type RedisAdapter struct {
modeStatus bool
}
func (r RedisAdapter) Enable(client domain.client) error {
cmdArgs := []string{
"redis-job-shard-pause",
strconv.Itoa(client.Shard()),
strconv.Itoa(client.Duration()),
}
cmd := fmt.Sprintf("%v", command)
out, err := exec.Command(cmd, cmdArgs...).Output()
fmt.Printf("%v", string(out))
return err
}
在 error=nil 和 error=fs.PathError 时运行测试的单元测试代码:
func TestEnableService_SetEnable(t *testing.T) {
type fields struct {
LoadEnablePort out.EnablePort
}
type args struct {
client domain.Client
}
fileNotFound := fs.PathError{
Op: "fork/exec",
Path: "/tmp/cmd",
Err: syscall.ENOENT,
}
tests := []struct {
name string
fields fields
args args
want error
}{
{
"Enable Redis",
fields{
LoadEnablePort: redis.RedisAdapter{},
},
args{
client: domain.Client{},
},
nil,
},
{
"enable_redis_cmd_not_found",
fields{
LoadEnablePort: redis.RedisAdapter{},
},
args{
client: domain.Client{},
},
&fileNotFound,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
s := EnableService{
LoadEnablePort: tt.fields.LoadEnablePort,
}
if got := s.LoadEnablePort.Enable(tt.args.client); got != tt.want {
t.Errorf("LoadEnablePort.RedisAdapter.Enable = %v, want %v", got, tt.want)
}
})
}
}
nil 测试工作正常,但是当我捕获第二个测试时,即使对象在调试器中显示完全相同,也无法说明测试失败的原因:
https://i.stack.imgur.com/CTtfk.png
注意“got”变量与“tt.want”变量对象完全相同,最后我有以下失败的测试:
=== RUN TestEnableService_SetEnable/enable_redis_cmd_not_found
setModeService_test.go:116: LoadEnablePort.RedisAdapter.Enable = fork/exec /tmp/cmd: no such file or directory, want fork/exec /tmp/cmd: no such file or directory
--- FAIL: TestEnableService_SetEnable/enable_redis_cmd_not_found (549.32s)
非常感谢您的帮助。
【问题讨论】:
标签: unit-testing go error-handling