我目前正在為一個專案創建單元測驗,我需要測驗一個沒有來自物體介面的依賴注入的函式。這是代碼
func (u UserUsecase) CreateUser(ctx context.Context, p request.StoreUser) (entity.User, error) {
user := &entity.User{
Username: p.Username,
Email: p.Email,
Phone: p.Phone,
Password: p.Password,
CompanyID: p.CompanyID,
}
err := user.Create(ctx, u.userRepo)
if err != nil {
return entity.User{}, err
}
return *user, nil
}
其中user.Create(ctx, u.userRepo)有一個呼叫另一個函式的函式,所以當我創建一個測驗函式時,我一直卡住并獲得無效的記憶體地址或空指標。這是代碼中的user.Create(ctx, u.userRepo)
func (u *User) Create(ctx context.Context, ur UserStoreRepo) error {
u.UUID = uuid.New()
u.Status = constanta.ACTIVE
pass, err := helpers.Bcrypting(u.Password)
if err != nil {
return err
}
u.Password = pass
err = ur.Store(ctx, u)
return err
}
覆寫的最佳方法是什么,user.Create(ctx, u.userRepo)以便我可以測驗CreateUser(ctx context.Context, p request.StoreUser).
uj5u.com熱心網友回復:
使用介面并使用mock struct實作它來測驗
type User interface {
CreateUser(ctx context.Context, p request.StoreUser) (entity.User, error)
}
type user struct {
//... user struct
}
func (u *user) CreateUser(ctx context.Context, p request.StoreUser) (entity.User, error) {
//... real code goes here
}
然后創建一個模擬
type mockUser struct {
result entity.User
err error
}
func (u *mockUser) CreateUser(ctx context.Context, p request.StoreUser) (entity.User, error) {
return u.result, u.err
}
然后創建一個測驗
func TestError(t *testing.T) {
errMockUser := &mockUser{nil,erorrs.New("error")}
result, err := errMockUser.CreateUser(context.Background(),
request.StoreUser{})
assert.Nil(t, result)
assert.Equal(t, errors.New("error"), err)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/473047.html
上一篇:使用'count'標志多次運行測驗時,net/rpc服務器保持注冊狀態
下一篇:從Go中的函式回傳指向結構的指標
