mockgen的Return Method在调用过程中更改了预期值



我是Go的新手,最近我正在尝试使用gomock包编写测试用例。我遇到了一个奇怪的问题。我正在尝试为GetUsers编写测试用例实现是

func (ctrl *HttpController) GetUsers(w http.ResponseWriter, r *http.Request) {
users := ctrl.DS.GetUsers()

// changed the name of the user
users[0].Name = "User C"
utility.JsonOkResponse(w, users)
} 

这是我的测试功能

func TestGetUsers_Success(t *testing.T) {
// setup mock interfaces
ctrl, ds, _ := setup(t)
// setup expected function calls
expected := mock_data.Users
ds.EXPECT().GetUsers().Return(expected)
// create the request
req := httptest.NewRequest("GET", "/users", nil)
// generate router
mux := mux.NewRouter()
mux.HandleFunc("/users", ctrl.GetUsers)
// create response recorder
resp := httptest.NewRecorder()
mux.ServeHTTP(resp, req)
// check response contents
assert.Equal(t, http.StatusOK, resp.Code)
var users []model.User
json.Unmarshal(resp.Body.Bytes(), &users)
assert.Equal(t, expected, users)
}

这些是mock_data.Users

var Users = []model.User{user1, user2}
// sample user data
var user1 = model.User{
ID:       1,
Name:     "User A",
Email:    "usera@gmail.com",
}
var user2 = model.User{
ID:       2,
Name:     "User B",
Email:    "userb@gmail.com",
}

现在,为了更好地理解,我尝试了不同的场景。因此,在这种情况下,我的测试用例应该失败(尽管它仍然通过(,因为我在GetUsers函数中更改了一个用户名,但奇怪的是,测试用例仍然通过,当我执行assert.Equal(t, expected, users)时,预期的值也会更改为新用户名user C。在mockgen的Return方法中,是预期的值作为指针传递的,还是我缺少了一些基本的东西?

之所以会发生这种情况,是因为当您执行expected := mock_data.Users时,您正在复制切片标头,而不是底层数组,因此对第一个切片的数组的更改将更改另一个切片。请看这篇文章了解更多详细信息。

如果你想复制切片,你需要使用内置的copy函数,比如:

expected := make([]model.User, len(mock_data.Users))
copy(expected, mock_data.Users)

相关内容

  • 没有找到相关文章

最新更新