Golang测试,调用数据库的Prepare应该失败,但实际上没有失败。

huangapple go评论90阅读模式
英文:

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

huangapple
  • 本文由 发表于 2016年11月2日 19:44:11
  • 转载请务必保留本文链接:https://go.coder-hub.com/40379147.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定