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é.
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.
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!