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

我正在使用 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。


我开始认为问题在于我将如何连接到数据库。


慕雪6442864
浏览 88回答 1
1回答

呼啦一阵风

使您的处理程序成为包含处理程序依赖项的结构上的方法: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))}在您的测试代码中,您可以简单地注入一个不同的数据库,让您的测试在该数据库上运行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go