导入包的单元测试

huangapple go评论82阅读模式
英文:

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)
}

huangapple
  • 本文由 发表于 2022年5月11日 00:29:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/72189953.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定