如何在golang中的for循环中模拟相同的输入和不同的返回值

时间:2017-09-22 22:43:48

标签: unit-testing go testify

我使用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)
        })
    }
}

1 个答案:

答案 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