我编写测试,在此测试中,我使用一些保存的数据文件,数据库记录等。
我应该在测试结束之前删除此数据吗?
例如,我检查了user
查找程序
func (ID int) User (*User) {
// my finder here
}
在测试之前,我必须为数据库创建User
。所以,我应该做类似的事情
defer db.Clean()
???
与文件*os.File
答案 0 :(得分:0)
如果您正在谈论对代码进行单元测试,则不应调用该数据库。您应该使用可以存根或模拟的接口。
答案 1 :(得分:0)
为了使我们都在同一页上,有许多不同形式的测试。在这里,我们将考虑单元测试和集成测试。
如果您正在进行单元测试,我希望仅使用模拟,而不会与文件进行交互。因此,我认为这是用于某种集成测试。
This is a link和一堆幻灯片,从hashicorp的创始人兼CTO米切尔(Mitchellh)在测试中的演讲
本次演讲中描述的方法之一是返回一个func()
闭包,该闭包随后将负责清理。
您可以将所有设置逻辑封装到一个返回清除闭包的函数中。
func SetupIntegrationDB(t *testing.T, addr string) (*sql.DB, func()) {
// setup the connection, use t.Fatal for all errors.
cleanup := func() {
// here you have access to both t, and *sql.DB
// you can do all the clean up required,
// and return this anonymous function to be called later
}
return db, cleanup
}
// inside your test
db, cleanup := SetupIntegrationDB(t, addr)
defer cleanup()
这与您在问题中建议的内容非常相似,但允许略微改善清理逻辑的封装。您所有的测试仅需要执行它们提供的清理功能,而无需关心它的完成方式。
相同的模式可用于文件,返回文件(或io.Writer
),以及一个知道该文件存在位置并可以稍后删除该文件的函数。