Golang测试,调用数据库准备应该失败,但事实并非如此

时间:2016-11-02 11:44:11

标签: database unit-testing go mocking

我在go sqlmock的帮助下编写了一些测试代码。

以下代码不会验证预准备语句是否具有正确的查询。

主要代码是:

// main.go
package main

import "database/sql"

func testFunction(db *sql.DB) {
    db.Prepare("SELECT")
}

func main() {}

测试代码:

// main_test.go
package main

import (
    "testing"

    "github.com/stretchr/testify/assert"
    sqlmock "gopkg.in/DATA-DOG/go-sqlmock.v1"
)

func TestPrepare(t *testing.T) {
    db, mock, mErr := sqlmock.New()
    assert.NoError(t, mErr)
    defer db.Close()

    mock.ExpectPrepare("^BADSELECT$")

    testFunction(db)

    if err := mock.ExpectationsWereMet(); err != nil {
        t.Errorf("there were unfulfilled expections: %s", err)
    }

}

据我所知,测试应该失败,,但事实并非如此。我做错了什么? 我正在使用GO 1.7 / macOS 10.12.1。

谢谢

1 个答案:

答案 0 :(得分:1)

回答我自己的问题,

调用ExpectPrepare()返回一个ExpectPrepare结构。为了断言使用正确的查询调用Prepare(),必须在结构上使用ExpectQuery。 请参见下面的示例。

package main

import (
    "database/sql"
    "fmt"
)

func testFunction(db *sql.DB) {
    stmt, err := db.Prepare("SELECT")
    if err != nil {
        fmt.Println(err)
}

    stmt.Query()

}

func main() {}

package main

import (
    "testing"

    "github.com/stretchr/testify/assert"
    sqlmock "gopkg.in/DATA-DOG/go-sqlmock.v1"
)

func TestPrepare(t *testing.T) {
    db, mock, mErr := sqlmock.New()
    assert.NoError(t, mErr)
    defer db.Close()

    mock.ExpectPrepare("^SELECT$").ExpectQuery()

   testFunction(db)

    if err := mock.ExpectationsWereMet(); err != nil {
        t.Errorf("there were unfulfilled expections: %s", err)
    }

}

编辑:

报告问题后,事实证明这实际上是go-sqlmock包中的BUG。它已修复。我们现在应该能够使用ExpectPrepare()。 go-sqlmock issue #50

由于