英文:
Golang test, call to database Prepare should fail, but it does not
问题
我正在使用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。
谢谢
英文:
I'm writing some test code with the help of go sqlmock.
The following code does not validates if the prepared statement has the correct query.
The main code is this:
// main.go
package main
import "database/sql"
func testFunction(db *sql.DB) {
db.Prepare("SELECT")
}
func main() {}
And the test code:
// 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)
}
}
As far as i know, the test should fail, but it does't. What i'm i doing wrong?
I'm using GO 1.7/macOS 10.12.1.
Thanks
答案1
得分: 3
回答我的问题,
调用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
谢谢
英文:
Answering my own question,
Calling ExpectPrepare() returns a ExpectPrepare struct. In order to assert that Prepare() is being called with the right query, on must use ExpectQuery on the struct.
See the example bellow.
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)
}
}
EDIT:
After reporting an issue, it turns out this was actually a BUG in the go-sqlmock package. It's fixed. We should now be able to use ExpectPrepare().
go-sqlmock issue #50
Thanks
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论