Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
如何在Go中为rest服务设置Mongo DB,以允许单元测试?_Rest_Unit Testing_Go_Mux - Fatal编程技术网

如何在Go中为rest服务设置Mongo DB,以允许单元测试?

如何在Go中为rest服务设置Mongo DB,以允许单元测试?,rest,unit-testing,go,mux,Rest,Unit Testing,Go,Mux,我正在使用MongoDB和mux路由器在go中设置rest服务。我遇到了如何最好地设置它以允许在单独的数据库中进行单元/集成测试的问题 我曾尝试在Init函数中设置数据库,但在尝试使用测试数据库设置单元测试时遇到了问题 下面是一些我现在所处位置的例子。我试图在发布之前使用一种方法连接到数据库,以便在测试中可以连接到其他测试数据库 类型用户结构{ name字符串`json:name` age int`json:age` } 类型数据库结构{ db*mongo.Database } func Con

我正在使用MongoDB和mux路由器在go中设置rest服务。我遇到了如何最好地设置它以允许在单独的数据库中进行单元/集成测试的问题

我曾尝试在Init函数中设置数据库,但在尝试使用测试数据库设置单元测试时遇到了问题

下面是一些我现在所处位置的例子。我试图在发布之前使用一种方法连接到数据库,以便在测试中可以连接到其他测试数据库

类型用户结构{ name字符串`json:name` age int`json:age` } 类型数据库结构{ db*mongo.Database } func ConnectToDB*数据库,错误{ 客户端,错误:=mongo.NewClientoptions.client.ApplyURImongodb://localhost:27017 如果错误!=零{ 返回零,错误 } 如果错误:=client.Connectcontext.Background;错误!=nil{ 返回零,错误 } 数据库:=&数据库{ db:client.DatabasePMBaseGo, } 返回数据库,无 } func postaserw http.ResponseWriter,r*http.Request{ w、 Header.SetContent-Type,application/json //检索请求正文 var用户 _=json.NewDecoderr.Body.Decode&user //邮递公司。 错误:=postasertobuser //错误处理 如果错误!=零{ 打印错误 w、 写头500 } } func d*数据库CONNSPOSTSERTODBUSER用户错误{ _,err:=d.db.collectioncompanys.InsertOnecontext.Background,用户 如果错误!=零{ 返回错误 } 归零 } func main{ _,uu=ConnectToDB r:=mux.NewRouter r、 HandleFunc/用户,postaser.MethodsPOST 正在运行fmt.println应用程序。。。 log.Fatalhttp.listendServelocalHost:8081,r } 我现在遇到的问题是如何在positioner函数中调用postasertodb方法


我开始认为,在此之前的问题在于如何连接到数据库。

将处理程序设置为包含处理程序依赖项的结构上的方法:

type server struct {
    srv *service
}

type service struct {
    db *mongo.Database
}

func (s *server) PostUser(w http.ResponseWriter, r *http.Request) {
    // Create user struct from request data...

    if err := s.srv.CreateUser(u); err != nil {
        // Error response.
    }

    // Success response.
}

func (s *service) CreateUser(u *user) error {
    // ...
    _, err := d.db.Collection("foo").InsertOne(r.Context(), user)
    return err
}

func main() {
    s := &server{
        srv: &service{
            db: getMongoDatabase(),
        },
    }

    r := mux.NewRouter()
    r.HandleFunc("/user", s.PostUser).Methods("POST")

    log.Fatal(http.ListenAndServe("localhost:8081", r))
}

在测试代码中,您可以简单地插入不同的数据库,让您的测试在该数据库上运行。

您需要为测试进行设计。如果您向后跟踪测试中的代码,则硬编码为调用获取数据库连接的特定实现,该实现硬编码为连接到特定的数据库DSN。如果您想连接到外部mongo服务器,这实际上是完全不稳定的,更不用说在生产环境中不可用了。我想这就是我尝试使用单独调用所做的。Postoser处理HTTP请求以及调用数据库的PostoserToDB。你的答案似乎把它去掉了,并且完成了HTTP函数中的所有操作。我现在有点困惑,在没有遇到我最初的问题的情况下如何将它分开。@jmacnc最初为了简洁起见,我省略了它,但我已经更新了我的答案,在两者之间添加了一个额外的服务层