为什么 "mock.ExpectQuery" return "is without arguments"
Why "mock.ExpectQuery" return "is without arguments"
下面是我的单元测试文件:
func TestAddLike(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
defer db.Close()
rows := sqlmock.NewRows([]string{"id", "title", "body"}).
AddRow(1, "post 1", "hello").
AddRow(2, "post 2", "world")
mock.ExpectQuery("SELECT (.+) FROM testmock").
WillReturnRows(rows)
if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expectations: %s", err)
}
}
框架:gin
数据库: gorm
我想写一个单元测试..
我有两个问题:
- 如何
sqlmock.New()
选择数据库?
- 为什么
mock.ExpectQuery
returnis without argument
提前致谢。
- 如何sqlmock.New()选择数据库?
答案:它不会对数据库进行实际调用。它是一个 Mock
,这意味着不是真正的数据库。
- 为什么mock.ExpectQuery return没有参数
回答: 我没有看到 TestAddLike(t *testing.T)
中有对 AddLike()
的调用。也试着把它放好:
func TestAddLike(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
defer db.Close()
rows := sqlmock.NewRows([]string{"id", "title", "body"}).
AddRow(1, "post 1", "hello").
AddRow(2, "post 2", "world")
mock.ExpectQuery("SELECT (.+) FROM testmock").
WillReturnRows(rows)
AddLike() // <- Add the call to actual function here. Before mock.ExpectationsWereMet
if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expectations: %s", err)
}
}
- 我想查看我的数据库是否增加了
答:你不能。编写单元测试的主要目的是隔离(独立于实际的数据库调用或对某些服务器的 API 调用)函数并根据这些依赖项的输出测试函数的逻辑(例如:DB throws an error
或 API
调用 return 的不同响应)。调用实际数据库将打破该规则。这就是集成测试发挥作用的地方。
现在,作为单元测试的一部分,您只需检查:
- 如果将正确的
SQL
查询传递给 SQL mock
- 一旦您 return 数据库的
mock
响应,验证函数的输出是否为 expected
下面是我的单元测试文件:
func TestAddLike(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
defer db.Close()
rows := sqlmock.NewRows([]string{"id", "title", "body"}).
AddRow(1, "post 1", "hello").
AddRow(2, "post 2", "world")
mock.ExpectQuery("SELECT (.+) FROM testmock").
WillReturnRows(rows)
if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expectations: %s", err)
}
}
框架:gin
数据库: gorm
我想写一个单元测试..
我有两个问题:
- 如何
sqlmock.New()
选择数据库? - 为什么
mock.ExpectQuery
returnis without argument
提前致谢。
- 如何sqlmock.New()选择数据库?
答案:它不会对数据库进行实际调用。它是一个 Mock
,这意味着不是真正的数据库。
- 为什么mock.ExpectQuery return没有参数
回答: 我没有看到 TestAddLike(t *testing.T)
中有对 AddLike()
的调用。也试着把它放好:
func TestAddLike(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
defer db.Close()
rows := sqlmock.NewRows([]string{"id", "title", "body"}).
AddRow(1, "post 1", "hello").
AddRow(2, "post 2", "world")
mock.ExpectQuery("SELECT (.+) FROM testmock").
WillReturnRows(rows)
AddLike() // <- Add the call to actual function here. Before mock.ExpectationsWereMet
if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expectations: %s", err)
}
}
- 我想查看我的数据库是否增加了
答:你不能。编写单元测试的主要目的是隔离(独立于实际的数据库调用或对某些服务器的 API 调用)函数并根据这些依赖项的输出测试函数的逻辑(例如:DB throws an error
或 API
调用 return 的不同响应)。调用实际数据库将打破该规则。这就是集成测试发挥作用的地方。
现在,作为单元测试的一部分,您只需检查:
- 如果将正确的
SQL
查询传递给 SQL mock - 一旦您 return 数据库的
mock
响应,验证函数的输出是否为expected