我使用go lang测试在for循环中运行带有多个参数的测试。
我遇到了每次调用mock时返回相同返回值(和第一个set)的情况。我希望能够做的是在输入相同时改变每个测试的返回值,即在循环中相同On
但不同Return
。
我正在使用stretchr / testify进行模拟。当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)
})
}
}
答案 0 :(得分:9)
我有类似的问题。
解决方案是方法Once()
在模拟中添加.Once()
,并根据需要的每个结果重复模拟。
类似这样的东西:
lib.Mock.On("method", arg).Return(test.mockError).Once()
lib.Mock.On("method", arg).Return(nil).Once()
每个模拟结果仅返回一次。
https://godoc.org/github.com/stretchr/testify/mock#Call.Once