Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb TestMain m.Run()之后的Teardown函数永远不会被调用_Mongodb_Go_Mgo - Fatal编程技术网

Mongodb TestMain m.Run()之后的Teardown函数永远不会被调用

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"}

在下面的测试代码中,我测试了一些端点和数据库(mongoDB)特性。我正在使用mgo包,每次访问数据库时,我都有一些抽象来获取新的会话副本

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语句。即使这个特定的语句没有运行,唯一的问题就是一个悬空的会话副本。