使用sqlmock的DB mock不能用于测试Gin/GORM API



我有一个使用Gin编写的API,该API将GORM用于ORM。API在使用真实数据库和从web浏览器访问API URL时工作得非常好。但我无法通过模拟单元测试:

func TestRespForGetUsersHandlerWithSomeUsers(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatal("can't create mock db")
}
defer db.Close()
sqlmock.NewRows(
[]string{"id", "name", "username"},
).
AddRow(1, "Abhishek Kumar", "abhishek")
w := httptest.NewRecord()
c, _ := gin.CreateTestContext(w)
postgresDB := postgres.New(postgres.Config{Conn: db})
gormDB, err := gorm.Open(postgresDB, &gorm.Config{})
if err != nil {
t.Fatal("can't create gormDB")
}
api.GetUsersWrapper(gormDB)(c)
if w.Code != http.StatusOK {
t.Errorf("Expected status code to be %d but got %d", http.StatusOK, w.Code)
}
var got []models.User
if err := json.Unmarshal(w.Body.Bytes(), &got); err != nil {
t.Fatalf("Can't unmarshal response body: %s", err)
}
if len(got) != 1 {
t.Errorf("Expected response to be 1 item but got %d items", len(got))
}
}

最后一个if-语句被触发。got的长度实际上是0。然而,如果我尝试从浏览器调用与GetUsersWrapper相关联的API端点(当服务器使用真实的DB时(,一切都会按预期进行。

我怀疑sqlmock.NewRows没有创建行,使其对gormDB可见,或者我没有正确测试来自GetUsersWrapper的响应。如何正确地对ginAPI进行单元测试?

如果您愿意尝试另一种方法,可以使用keploy对您的gin API进行单元测试。它是开源的,也支持GORM。

https://github.com/keploy/keploy

最新更新