我嘗試在我的 go 代碼中實作一些單元測驗,發現模擬方法的主題非常困難。我有以下示例,希望您能幫助我 :)
在第一層我有以下代碼:
package api
import (
"fmt"
"core"
)
type createUserDTO struct {
Id string
}
func ApiMethod() {
fmt.Println("some incoming api call wit user")
incomingUserData := &createUserDTO{Id: "testId"}
mapedUser := incomingUserData.mapUser()
mapedUser.Create()
}
func (createUserDTO *createUserDTO) mapUser() core.User {
return &core.UserCore{Id: createUserDTO.Id}
}
第二層有如下代碼:
package core
import (
"fmt"
)
type CoreUser struct{ Id string }
type User interface {
Create()
}
func (user CoreUser) Create() {
fmt.Println("Do Stuff")
}
我現在的問題是,如何在不測驗核心包的情況下測驗 api 包中的每個公共方法。特別是方法 Create()。
uj5u.com熱心網友回復:
根據評論,我整理了一個簡單的 GitHub 存盤庫來展示我通常如何處理 Go 中的結構化專案。存盤庫暫時不考慮測驗部分,但使用此專案結構插入它們應該很容易。
讓我們從一般檔案夾的布局開始:
controllersservicesdbdtomodels
現在,讓我們看看相關檔案。
models/user.go
package models
import "gorm.io/gorm"
type User struct {
*gorm.Model
Id string `gorm:"primaryKey"`
}
func NewUser(id string) *User {
return &User{Id: id}
}
簡單的結構定義在這里。
dto/user.go
package dto
import "time"
type UserDTO struct {
Id string `json:"id"`
AddedOn time.Time `json:"added_on"`
}
func NewUserDTO(id string) *UserDTO {
return &UserDTO{Id: id}
}
我們用一個虛擬AddedOn欄位來豐富模型結構,這只是為了演示。
db/user.go
package db
import (
"gorm.io/gorm"
"userapp/models"
)
type UserDb struct {
Conn *gorm.DB
}
type UserDbInterface interface {
SaveUser(user *models.User) error
}
func (u *UserDb) SaveUser(user *models.User) error {
if dbTrn := u.Conn.Create(user); dbTrn.Error != nil {
return dbTrn.Error
}
return nil
}
在這里,我們定義了一個使用User存盤庫的介面。在我們的測驗中,我們可以提供模擬而不是UserDb結構的實體。
services/user.go
package services
import (
"time"
"userapp/db"
"userapp/dto"
"userapp/models"
)
type UserService struct {
DB db.UserDbInterface
}
type UserServiceInterface interface {
AddUser(inputReq *dto.UserDTO) (*dto.UserDTO, error)
}
func NewUserService(db db.UserDbInterface) *UserService {
return &UserService{
DB: db,
}
}
func (u *UserService) AddUser(inputReq *dto.UserDTO) (*dto.UserDTO, error) {
// here you can write complex logic
user := models.NewUser(inputReq.Id)
// invoke db repo
if err := u.DB.SaveUser(user); err != nil {
return nil, err
}
inputReq.AddedOn = time.Now()
return inputReq, nil
}
這是橋接表示層和底層存盤庫之間連接的層。
controllers/user.go
package controllers
import (
"encoding/json"
"io"
"net/http"
"userapp/dto"
"userapp/services"
)
type UserController struct {
US services.UserServiceInterface
}
func NewUserController(userService services.UserServiceInterface) *UserController {
return &UserController{
US: userService,
}
}
func (u *UserController) Save(w http.ResponseWriter, r *http.Request) {
reqBody, err := io.ReadAll(r.Body)
if err != nil {
panic(err)
}
r.Body.Close()
var userReq dto.UserDTO
json.Unmarshal(reqBody, &userReq)
userRes, err := u.US.AddUser(&userReq)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode(err)
return
}
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(userRes)
}
在這里,我們定義了(通過依賴注入)使用UserService結構的控制器。
您可以在我的GitHub存盤庫中找到所有內容 如果它能澄清一點,請告訴我。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/534064.html
標籤:去测试嘲笑
上一篇:hashCode等于Integer.MIN_VALUE的Java字串
下一篇:解讀數倉常用模糊查詢的優化方法
