为什么 "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

我想写一个单元测试..

我有两个问题:

  1. 如何sqlmock.New()选择数据库?
  2. 为什么mock.ExpectQueryreturnis without argument

提前致谢。

  1. 如何sqlmock.New()选择数据库?

答案:它不会对数据库进行实际调用。它是一个 Mock,这意味着不是真正的数据库。

  1. 为什么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)
    }

}
  1. 我想查看我的数据库是否增加了

答:你不能。编写单元测试的主要目的是隔离(独立于实际的数据库调用或对某些服务器的 API 调用)函数并根据这些依赖项的输出测试函数的逻辑(例如:DB throws an errorAPI 调用 return 的不同响应)。调用实际数据库将打破该规则。这就是集成测试发挥作用的地方。

现在,作为单元测试的一部分,您只需检查:

  • 如果将正确的 SQL 查询传递给 SQL mock
  • 一旦您 return 数据库的 mock 响应,验证函数的输出是否为 expected