I'm running a test with multiple parameters in a for loop using go lang testing.
I ran into a situation where same return value (and first set) is returned every time the mock is called. What I want to be able to do is change the return value for each test when the input is same i.e., same On
but different Return
in a loop.
I am using stretchr/testify for mocks. It looks like it will not overwrite already created mock when On
is same.
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)
})
}
}
On
method? It seems that is the problem here, not Go itself. – ContumeliousMockCSClient
is created in my test. But thats a good idea, will try that. – Unraveltest := test
. In for loops you have to keep in mind pointers, which is a common pitfall. This article might highlight the problem you are facing medium.com/@pedram.esmaeeli/golang-pitfalls-f2ebae9c8208 – Saucy