ожидать (spiedMethod) .not.toBeCalled () не удается, потому что он вызывается другим тестом - PullRequest
0 голосов
/ 15 февраля 2019

Я пытался покрыть нашу кодовую базу тестами.Я использую jest с NestJS .Это метод входа в систему.

  public async login(
    @Body() loginDto: DUserLoginRequest,
  ): Promise<DResponse<DLoginResponseV2>> {
    const user: User = await this.userService.verifyCredentials(
      loginDto.login,
      loginDto.password,
    );

    let userTransformed = new DUser(user);
    let accessToken: string = await this.authService.generateUserAccessToken(
      user,
    );

    return new DResponse<DLoginResponseV2>(
      'Successfully logged in',
      new DLoginResponseV2(userTransformed, accessToken),
    );
  }

UserService.verifyCredentials() выбрасывает UnauthorizedException, если указан неправильный адрес электронной почты или пароль.

А вот мои контрольные примеры.

  describe('login', () => {
    it('should return user details on successfull login', async () => {
      let loginPayload: DUserLoginRequest = {
        login: 'sayantan.das@codelogicx.com',
        password: 'sayantan94'
      };

      let dUser = new DUser(user);

      let response = new DResponse<DLoginResponseV2>(
        'Successfully logged in',
        new DLoginResponseV2(dUser, 'access_token')
      );

      expect(await userController.login(loginPayload)).toEqual(response);
      expect(userService.verifyCredentials).toBeCalled();
      expect(userService.verifyCredentials).toBeCalledWith(loginPayload.login, loginPayload.password);

      expect(authService.generateUserAccessToken).toBeCalled();
      expect(authService.generateUserAccessToken).toBeCalledWith(user);
      expect(authService.generateUserAccessToken).toReturnWith('access_token');
    });

    it('should throw UnauthorizedException if wrong email or password is provided', async () => {
      let loginPayload = {
        login: 'wrongemail@gamil.com',
        password: 'wrongpassword'
      } as DUserLoginRequest;

      await expect(userController.login(loginPayload)).rejects.toThrow(UnauthorizedException);

      // this assertion fails. but works all right if the successful login test case is removed 
      await expect(authService.generateUserAccessToken).not.toBeCalled();
    });
  });

Но этот контрольный пример не проходит

FAIL  src/modules/user/user.controller.spec.ts
  ● User Controller › login › should throw UnauthorizedException if wrong email or password is provided

    expect(jest.fn()).not.toBeCalled()

    Expected mock function not to be called but it was called with:
      [{"country_code": "+91", "email": "sayantan.das@codelogicx.com", "first_name": "Sayantan", "id": 1, "image": "image.url", "last_name": "Das", "password": "$2a$10$.5OelkOKIn9rRuXMsge.yO8tgZdqK8i7PX7knJdjVdqgal7vsky16", "phone_number": "8013220938", "registration_status": "verified"}]

      115 | 
      116 |       await expect(userController.login(loginPayload)).rejects.toThrow(UnauthorizedException);
    > 117 |       await expect(authService.generateUserAccessToken).not.toBeCalled();
          |                                                             ^
      118 |     });
      119 |   });
      120 | });

Он не пройден, потому что тестовый сценарий с успешным входом в систему вызывает метод generateAccessToken,Если я удаляю успешный тестовый случай входа в систему, он работает нормально.Здесь я что-то не так делаю?

1 Ответ

0 голосов
/ 15 февраля 2019

Измените хук beforeAll, в котором вы устанавливаете макеты и вызываете Test.createTestingModule, на beforeEach, чтобы создавать новые макеты для каждого теста, см. Пример в документах теста .В большинстве случаев вы не заметите никаких изменений в производительности.

...