如何在 Go 中为允许单元测试的休息服务设置 Mongo 数据库?
How to set up Mongo DB in Go for a rest service that allows for unit testing?
我正在使用 MongoDB 和 mux 路由器在 go 中设置休息服务。我 运行 遇到有关如何最好地设置它以允许 unit/integration 在单独的数据库中进行测试的问题。
我已经尝试在 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))
}
我现在遇到的问题是试图在 PostUser
函数中调用 PostUserToDB
方法。
我开始认为问题在于我如何连接到数据库。
使您的处理程序成为包含处理程序依赖项的结构上的方法:
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))
}
在您的测试代码中,您可以简单地注入一个不同的数据库,让您的测试在该数据库上运行。
我正在使用 MongoDB 和 mux 路由器在 go 中设置休息服务。我 运行 遇到有关如何最好地设置它以允许 unit/integration 在单独的数据库中进行测试的问题。
我已经尝试在 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))
}
我现在遇到的问题是试图在 PostUser
函数中调用 PostUserToDB
方法。
我开始认为问题在于我如何连接到数据库。
使您的处理程序成为包含处理程序依赖项的结构上的方法:
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))
}
在您的测试代码中,您可以简单地注入一个不同的数据库,让您的测试在该数据库上运行。