预期值在 Return mockgen 调用期间的方法中发生了变化
Expected value is changed in Return Method of mockgen during its call
我是 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。 expected 值是在 mockgen 的 Return 方法中作为指针传递的,还是我遗漏了一些基本的东西?
发生这种情况是因为当您执行 expected := mock_data.Users
时,您正在制作切片 header 的副本,而不是基础数组,因此对第一个切片数组的更改将更改另一个。请查看此 article 了解更多详情。
如果要复制切片,您需要使用内置 copy
函数,如下所示:
expected := make([]model.User, len(mock_data.Users))
copy(expected, mock_data.Users)
我是 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。 expected 值是在 mockgen 的 Return 方法中作为指针传递的,还是我遗漏了一些基本的东西?
发生这种情况是因为当您执行 expected := mock_data.Users
时,您正在制作切片 header 的副本,而不是基础数组,因此对第一个切片数组的更改将更改另一个。请查看此 article 了解更多详情。
如果要复制切片,您需要使用内置 copy
函数,如下所示:
expected := make([]model.User, len(mock_data.Users))
copy(expected, mock_data.Users)