英文:
How to test transaction rollback and commit in go lang
问题
我有这样的代码:
tx, _ := db.Begin()
defer tx.Rollback()
err := db.Insert(foo)
err = db.Delete(bar)
if !err {
tx.Commit()
}
我不知道如何编写两个测试用例:
- 成功的情况(数据插入和删除)
- 错误的情况(没有任何更改)
我在考虑:
- 通过函数注入来进行猴子补丁,修改执行数据库操作的方法,并在测试中更改此函数
- 通过将
foo
的 SQL 改为全局变量来进行猴子补丁 - 我不太喜欢这种方法 - 在测试期间使数据库不允许删除操作
以上每个选项似乎都不是理想的,我应该如何编写这些测试用例?
英文:
I have such code:
tx, _ := db.Begin()
defer tx.Rollback()
err := db.Insert(foo)
err = db.Delete(bar)
if !err {
tx.Commit()
}
and I don't have idea how to write 2 test cases:
- successfull (data inserted and deleted)
- error (nothing changes)
I was thinking about:
- monkey patching by function injection to method which is doing db operations, and change this function in test
- monkey patching by changing
foo
sql by making it global - I don't like it too much - make db not allowing delete operation for test time
Each of above options seems to be not ideal, how should I write this test cases?
答案1
得分: 1
请看一下我的库dbwrap https://github.com/metakeule/dbwrap,它实现了一个driver.Driver,可以包装另一个驱动程序。
它还有一个你可以这样使用的虚拟驱动程序。
package main
import (
"fmt"
"github.com/metakeule/dbwrap"
)
var fake, db = dbwrap.NewFake()
func q1() {
fake.SetNumInputs(1)
db.Query("Select ?", "hiho")
q, v := fake.LastQuery()
fmt.Println(q, v)
}
使用fake.go
的源代码作为起点。
英文:
Have a look at my library dbwrap https://github.com/metakeule/dbwrap
that implements a driver.Driver, wrapping around another driver.
It also has a fake driver that you can use like this.
package main
import (
"fmt"
"github.com/metakeule/dbwrap"
)
var fake, db = dbwrap.NewFake()
func q1() {
fake.SetNumInputs(1)
db.Query("Select ?", "hiho")
q, v := fake.LastQuery()
fmt.Println(q, v)
}
Use the source code of <code>fake.go</code> as a starting point.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论