Mongodb TestMain m.Run()之后的Teardown函数永远不会被调用
在下面的测试代码中,我测试了一些端点和数据库(mongoDB)特性。我正在使用mgo包,每次访问数据库时,我都有一些抽象来获取新的会话副本Mongodb TestMain m.Run()之后的Teardown函数永远不会被调用,mongodb,go,mgo,Mongodb,Go,Mgo,在下面的测试代码中,我测试了一些端点和数据库(mongoDB)特性。我正在使用mgo包,每次访问数据库时,我都有一些抽象来获取新的会话副本 package resolvers_test import ( //various imports here ) func setup() { log.Println("ENTER SETUP\n") customerIndex := mgo.Index{ Key: []string{"email"}
package resolvers_test
import (
//various imports here
)
func setup() {
log.Println("ENTER SETUP\n")
customerIndex := mgo.Index{
Key: []string{"email"},
Unique: true,
Background: true,
Sparse: true,
}
session := db.GetSession().Copy()
defer session.Close()
customerCollection := session.DB("testDB").C("customerCollection")
customerCollection.EnsureIndex(customerIndex)
log.Println("EXIT SETUP")
}
func shutdown() {
log.Println("ENTER SHUTDOWN\n")
session := db.GetSession().Copy()
defer session.Close()
session.DB("testDB").DropDatabase()
log.Println("EXIT SHUTDOWN\n")
}
func TestMain(m *testing.M) {
setup()
code := m.Run()
shutdown()
os.Exit(code)
}
在shutdown()
函数中,我放置了一段应该删除测试数据库的代码,但是当调用setup()
函数时(我知道,因为它创建了索引),从未调用shutdown()
函数。有什么想法吗
编辑:我在输入end EXIT setup()和shutdown()以及控制台日志时添加了日志语句。这两个函数都是可访问的。日志如下所示:
2018/02/10 09:09:54 ENTER SETUP
2018/02/10 09:09:55 EXIT SETUP
=== RUN TestCreateCustomer
--- PASS: TestCreateCustomer (0.14s)
a_customerProfile_test.go:108: Create Customer successful
=== RUN TestCustomerProfile
--- PASS: TestCustomerProfile (0.27s)
a_customerProfile_test.go:152: Customer Profile Test Successful
PASS
2018/02/10 09:09:55 ENTER SHUTDOWN
2018/02/10 09:09:55 EXIT SHUTDOWN
您正在
setup()
因此,shutdown()
中的session:=db.GetSession().Copy()
将在未选择任何db的情况下获得新会话
Make
setup()
在TestMain()中返回*mgo.Session
并在TestMain()中声明延迟Session.Close()
通常的罪魁祸首是日志test@JimB在这个测试包中我没有任何恐慌。你能在shutdown()
函数中添加一个log语句,看看它是否真的达到了那个代码吗?如果没有,我猜有一些我们没有的测试用例阻止程序运行。开始注释所有的测试用例,然后一次添加一个,直到找到罪魁祸首。如果您仍然需要帮助,请尝试只发布该测试用例(或者简化它,直到您的测试的最简单版本仍然没有删除数据库)。Mgo将创建一个绑定到mongos的主会话对象。会话是用于选择服务器上存在的多个数据库之一的对象,而不是相反。此外,还保证在函数退出之前运行defer语句。即使这个特定的语句没有运行,唯一的问题就是一个悬空的会话副本。