为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中为允许单元测试的休息服务设置 Mongo DB?

如何在 Go 中为允许单元测试的休息服务设置 Mongo DB?

Go
慕雪6442864 2023-06-19 15:30:13
我正在使用 MongoDB 和 mux 路由器设置休息服务。我遇到了关于如何最好地设置它以允许在单独的数据库中进行单元/集成测试的问题。我曾尝试在 Init() 函数中设置数据库,但这在尝试使用测试数据库设置单元测试时给我带来了问题。以下是我现在所处位置的一些示例。我试图在发布之前使用一种方法连接到数据库,因此在我的测试中我可以连接到不同的测试数据库。type user struct {    name string `json:"name"`    age  int    `json:"age"`}type database struct {    db *mongo.Database}func ConnectToDB() (*database, error) {    client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"))    if err != nil {        return nil, err    }    if err := client.Connect(context.Background()); err != nil {        return nil, err    }    database := &database{        db: client.Database("PMBaseGo"),    }    return database, nil}func PostUser(w http.ResponseWriter, r *http.Request) {    w.Header().Set("Content-Type", "application/json")    //Retrieving request body    var user user    _ = json.NewDecoder(r.Body).Decode(&user)    //Posting Company.    err := PostUserToDB(user)    //Error Handling    if err != nil {        fmt.Println(err)        w.WriteHeader(500)    }}func (d *database) connPostUserToDB(user user) error {    _, err := d.db.Collection("companies").InsertOne(context.Background(), user)    if err != nil {        return err    }    return nil}func main() {    _, _ = ConnectToDB()    r := mux.NewRouter()    r.HandleFunc("/user", PostUser).Methods("POST")    fmt.Println("Application Running...")    log.Fatal(http.ListenAndServe("localhost:8081", r))}我现在遇到的问题是试图调用函数PostUserToDB中的方法PostUser。我开始认为问题在于我将如何连接到数据库。
查看完整描述

1 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

使您的处理程序成为包含处理程序依赖项的结构上的方法:


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))

}

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


查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信