database - Golang 测试,调用数据库 Prepare 应该会失败,但实际上并没有

标签 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。

谢谢

最佳答案

回答我自己的问题,

调用 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/

相关文章:

sql - 对于数小时的操作,数据库设计的好方法是什么?

mysql - 在 MySQL 中创建动态数量的表

android.database.sqlite.SQLiteException : Can't downgrade database from version 58 to 55 for android sms database

javascript - 开 Jest : Simulate that a string property doesn't exist

php - 如何在 PHP 脚本中查找 undefined variable

go - 如何使用反射调用带有指针接收器的结构上的方法?

php - 打开和关闭与数据库的连接或保留它

java - 测试网络应用程序

go - 在本地堆栈上使用 aws-sdk-go 创建的 S3 存储桶最终位置为 :/none

使用 RPM 进行字节到整数编码