我是 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: "[email protected]",
}
var user2 = model.User{
ID: 2,
Name: "User B",
Email: "[email protected]",
}
現在,我正在試驗不同的場景以更好地理解。因此,在這種情況下,我的測驗用例應該失敗(盡管它仍然通過),因為我在GetUsers 函式中更改了用戶名之一, 但奇怪的是,測驗用例仍然通過,并且當我執行assert.Equal(t, expected, users)時,預期中的值也更改為新用戶名用戶C。是預期值作為指標傳遞回mockgen的方法還是我失去了一些基本的東西?
uj5u.com熱心網友回復:
發生這種情況是因為當您expected := mock_data.Users復制切片標頭時,而不是底層陣列的副本,因此對第一個切片的陣列的更改將更改另一個。請查看這篇文章了解更多詳情。
如果要復制切片,則需要使用內置copy函式,如下所示:
expected := make([]model.User, len(mock_data.Users))
copy(expected, mock_data.Users)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358290.html
上一篇:用于捕獲單引號內資料的良好正則運算式,但前提是它帶有前綴?
下一篇:用go實作冒泡排序
