Maison >développement back-end >Golang >gomock fournit les appels manquants pour toutes les sous-méthodes sauf la première de la méthode principale

gomock fournit les appels manquants pour toutes les sous-méthodes sauf la première de la méthode principale

WBOY
WBOYavant
2024-02-08 22:18:091161parcourir

gomock 为除主方法中的第一个之外的所有子方法提供缺少的调用

L'éditeur PHP Strawberry vous présente gomock, qui est un outil de test puissant qui peut fournir les appels manquants pour toutes les sous-méthodes de la méthode principale sauf la première. Cela signifie que vous pouvez utiliser gomock pour simuler le comportement des sous-méthodes afin de mieux tester la fonctionnalité de la méthode principale. Gomock est très simple à utiliser, ce qui facilite la création et la configuration d'objets fictifs et la définition des valeurs d'appel et de retour attendues. Que vous soyez en test unitaire ou en test d'intégration, gomock peut vous aider à mieux tester et vérifier. Que vous soyez débutant ou développeur expérimenté, gomock est un excellent outil qui mérite d'être exploré et utilisé.

Contenu de la question

J'ai une méthode go qui est responsable de l'envoi des messages OTP aux utilisateurs. Il appelle quatre méthodes internes (je parle de sous-méthodes) RemoveOTP, GetOneTimePassCode, SaveOTP et SendOTP.

Nom du fichier : user_usecase.go

func (u *UserUseCase) SendUserOTP(ctx context.Context, user *domain.User, mobileNumber string) error {
    var err error
    var OTPNumber string
    var expiration time.Time
    //Remove previous OTP if any in DB
    if err = u.Repo.RemoveOTP(ctx, user.ID, mobileNumber); err != nil {
        return err
    }

    //Generate OTP
    OTPNumber, expiration, err = u.TokenService.GetOneTimePassCode()
    if err != nil {
        return err
    }

    //Save Code in Database and then send
    otpDataInput := domain.UserMobileOtps{
        UserID:       user.ID,
        MobileNumber: mobileNumber,
        Email:        user.Email,
        OtpCode:      OTPNumber,
        ExpiredAt:    expiration,
    }
    if err = u.Repo.SaveOTP(ctx, otpDataInput); err != nil {
        return err
    }

    if err = u.SMSService.SendOTP(ctx, mobileNumber, OTPNumber); err != nil {
        return err
    }
    return nil
}

Fichier de cas de test : user_usecase_test.go et méthode d'erreur de cas de test unitaire

// setup initializes common variables and returns them.
func setup(t *testing.T) (context.Context,
    *gomock.Controller,
    *mocks.MockUserRepository,
    usecase.UserUseCase,
    domain.User,
    *mocks.MockTokenService,
    *mocks.MockSMSService,
) {
    ctx := context.Background()
    ctrl := gomock.NewController(t)
    mockRepo := mocks.NewMockUserRepository(ctrl)
    mockTokenService := mocks.NewMockTokenService(ctrl)
    mockSmsService := mocks.NewMockSMSService(ctrl)
    uc := usecase.UserUseCase{Repo: mockRepo, TokenService: mockTokenService, SMSService: mockSmsService}
    user := domain.User{ID: 1}

    return ctx, ctrl, mockRepo, uc, user, mockTokenService, mockSmsService
}


func TestSendUserOTP_Error(t *testing.T) {
    ctx, ctrl, mockRepo, uc, user, mockTokenService, mockSmsService := setup(t)
    otpExpiration := time.Now().Add(time.Minute * 5)
    defer ctrl.Finish()

    someError := errors.New("some issue")
    mockRepo.EXPECT().RemoveOTP(ctx, user.ID, "XXXXXYYYYY").Return(someError).Times(1)
    mockTokenService.EXPECT().GetOneTimePassCode().Return("XXXYYY", otpExpiration, someError).Times(1)
    mockRepo.EXPECT().SaveOTP(ctx, domain.UserMobileOtps{UserID: user.ID, MobileNumber: "XXXXXYYYYY", Email: user.Email, OtpCode: "XXXYYY", ExpiredAt: otpExpiration}).Return(someError).Times(1)
    mockSmsService.EXPECT().SendOTP(ctx, "XXXXXYYYYY", "XXXYYY").Return(someError).Times(1)

    err := uc.SendVerificationOTP(ctx, &user, "XXXXXYYYYY")
    assert.Error(t, err)
    assert.Equal(t, someError, err)
}

Maintenant, lors de l'exécution du scénario de test, il ne génère aucune erreur pour RemoveOTP mais donne les trois méthodes restantes. C'est exactement l'erreur

TestSendUserOTP_Error
    controller.go:310: missing call(s) to *mocks.MockTokenService.GetOneTimePassCode() /project_path/user/usecase/user_usecase_test.go
    
    controller.go:310: missing call(s) to *mocks.MockUserRepository.SaveOTP(is equal to context.Background (*context.emptyCtx), is equal to {{0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC {0001-01-01 00:00:00 +0000 UTC false}} 0 4 XXXXXYYYYY  XXXYYY 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC {2023-10-06 10:34:25.951558924 +0530 IST m=+600.001514851 true} {0001-01-01 00:00:00 +0000 UTC false}} /project_path/user/usecase/user_usecase_test.go
  
    controller.go:310: missing call(s) to *mocks.MockSMSService.SendOTP(is equal to context.Background (*context.emptyCtx), is equal to XXXXXYYYYY (string), is equal to XXXYYY (string)) /project_path/user/usecase/user_usecase_test.go
    
    controller.go:310: aborting test due to missing call(s)
--- FAIL: TestSendUserOTP_Error (0.00s)

Je ne veux pas utiliser une solution comme AnyTimes() car je suis sûr que toutes les sous-méthodes seront appelées une fois. Quelle serait la solution idéale à cela ? Veuillez faire des suggestions.

Solution de contournement

Le problème est que votre fonction RemoveOTP() renvoie une erreur, donc votre code n'exécute aucune autre méthode. (Comme son nom l'indique, appels manqués)

Donnez AnyTimes() pour qu'il s'exécute avec succès car il peut s'exécuter de 0 à plusieurs fois.

Si vous voulez vraiment tester que toutes les méthodes sont exécutées une fois, vous pouvez peut-être vous moquer de toutes les fonctions sans renvoyer d'erreur afin qu'elles exécutent tout votre code

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer