我正在借助 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。
谢谢
最佳答案
回答我自己的问题,
调用 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)
}
}
编辑:
报了个issue,原来是go-sqlmock包的一个BUG。它是固定的。我们现在应该能够使用 ExpectPrepare()。 go-sqlmock issue #50
谢谢
关于database - Golang 测试,调用数据库 Prepare 应该会失败,但实际上并没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40379147/