英文:
Unit testing on imported package
问题
你好!根据你的描述,你想要测试一个具有依赖注入但没有接口的函数。你想知道如何重写user.Create(ctx, u.userRepo)
函数以便测试CreateUser(ctx context.Context, p request.StoreUser)
函数。
为了解决这个问题,你可以使用mock对象来模拟UserStoreRepo
接口,并在测试函数中注入该mock对象。这样,你就可以控制user.Create(ctx, u.userRepo)
函数的行为,并验证CreateUser(ctx context.Context, p request.StoreUser)
函数的逻辑是否正确。
以下是一个示例代码片段,展示了如何使用mock对象进行测试:
// 创建一个mock对象实现UserStoreRepo接口
type MockUserStoreRepo struct {
// 实现UserStoreRepo接口的方法
// ...
}
// 实现UserStoreRepo接口的Store方法
func (m *MockUserStoreRepo) Store(ctx context.Context, u *User) error {
// 在测试中可以自定义Store方法的行为
// ...
}
// 测试CreateUser函数
func TestCreateUser(t *testing.T) {
// 创建一个MockUserStoreRepo对象
mockRepo := &MockUserStoreRepo{}
// 创建UserUsecase对象,并将mockRepo注入
usecase := UserUsecase{
userRepo: mockRepo,
}
// 调用CreateUser函数进行测试
// ...
}
通过使用mock对象,你可以控制user.Create(ctx, u.userRepo)
函数的行为,使其返回你期望的结果,从而测试CreateUser(ctx context.Context, p request.StoreUser)
函数的逻辑。
希望这可以帮助到你!如果你有任何其他问题,请随时问我。
英文:
I am currently creating unit testing for a project, i need to test a function that have dependency injection without interface from an entity. Here is the code
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
}
In the user.Create(ctx, u.userRepo)
there is a function that call another function so when I create a test function I've been stuck and getting invalid memory address or null pointer. Here is the code in the 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
}
What is the best method to override the user.Create(ctx, u.userRepo)
so i can test the CreateUser(ctx context.Context, p request.StoreUser)
.
答案1
得分: 2
使用接口和使用模拟结构来实现它进行测试
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) {
//... 真正的代码在这里
}
然后创建一个模拟结构体
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)
}
英文:
Use interface and use mock struct implements it to test
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
}
Then create a mock
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
}
Then create a test like
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)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论