我在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。
谢谢
答案 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
由于