Tec*_*nch 19 unit-testing go testify
我正在使用 go lang testing 在 for 循环中运行具有多个参数的测试。
我遇到了每次调用模拟时都返回相同返回值(和第一组)的情况。我希望能够做的是在输入相同时更改每个测试的返回值,即在循环中相同On但不同Return。
我正在使用拉伸器/作证进行模拟。看起来它不会在相同时覆盖已经创建的模拟On。
func TestUpdateContactWithNewActions(t *testing.T) {
tests := []struct {
testName string
getParams func() *activities.UpdateContactWithNewActionsActivity
mockError error
}{
{"UpdateContactWithNewActions with error from contact service",
func() *activities.UpdateContactWithNewActionsActivity {
return fixtures.GetUpdateContactWithNewActionsActivity()
}, fixtures.Err},
{"UpdateContactWithNewActions valid",
func() *activities.UpdateContactWithNewActionsActivity {
return fixtures.GetUpdateContactWithNewActionsActivity()
}, nil},
}
lib.LoadWithMockClients()
for _, test := range tests {
test := test
t.Run(test.testName, func(t *testing.T) {
lib.MockCSClient.On(
"UpdateContactWithNewActions",
mock.AnythingOfType("tchannel.headerCtx"),
fixtures.UpdateContactWithNewActions).Return(test.mockError)
returnedResult, err := test.getParams().Execute(fixtures.Ctx)
if test.mockError == nil {
// some assertion
}
assert.Error(t, err)
})
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*cos 24
我有一个类似的问题。
解决方法是 Once()
在您的模拟中添加一个.Once()并使用您需要的每个结果重复模拟。
像这样的东西:
lib.Mock.On("method", arg).Return(test.mockError).Once()
lib.Mock.On("method", arg).Return(nil).Once()
Run Code Online (Sandbox Code Playgroud)
每个模拟结果只会返回一次。
https://godoc.org/github.com/stretchr/testify/mock#Call.Once
当结果需要返回一次时,@Marcos 提供的答案效果很好。
但在每个返回值需要返回多次(未知)的场景下,就不行了。
我解决这个问题的方法是mock.ExpectedCalls直接操作。在我的例子中,模拟只包含一个方法,因此清理整个ExpectedCalls切片很简单,但如果有多个方法,则ExpectedCalls可以迭代切片,并仅更新所需的调用。
这是一个简单情况的工作示例:
lib.Mock.On("method", arg).Return("1")
assert.Equal(t, lib.Mock.method(arg), "1")
assert.Equal(t, lib.Mock.method(arg), "1")
....
assert.Equal(t, lib.Mock.method(arg), "1")
lib.Mock.ExpectedCalls = nil // cleanup the previous return value
lib.Mock.On("method", arg).Return("2")
assert.Equal(t, lib.Mock.method(arg), "2")
assert.Equal(t, lib.Mock.method(arg), "2")
....
assert.Equal(t, lib.Mock.method(arg), "2")
Run Code Online (Sandbox Code Playgroud)