Как правильно смоделировать Amplify для модульного тестирования в Жасмин? - PullRequest
0 голосов
/ 28 февраля 2020

Я совсем новичок в модульном тестировании, поэтому терпите меня

Я пытаюсь провести модульное тестирование службы, которая используется для регистрации пользователя с помощью Amplify в приложении Angular.

Прямо сейчас в файле spe c, который я делаю:

 beforeEach(async () => {
        TestBed.configureTestingModule({
            imports: [
                HttpClientTestingModule,
            ],
            providers: [
                MyService, Amplify
            ]
        }
      myService = TestBed.get(MyService)
      amplify = TestBed.get(Amplify)
    })

   it('should login', async () => {
      const objToBeReturned = { signInUserSession: { idToken: { jwtToken: 'tokenValue' } } }
      spyOn(Amplify.Auth, 'signIn').and.returnValue(objToBeReturned)

      await myService.login('username', 'password')
   })

Находясь в MyService :

  public async login(username: string, password: string) {
    const authUser = await Amplify.Auth.signIn(username.toLowerCase(), password)
    if (authUser.signInUserSession != null) {
      const idToken = authUser.signInUserSession.idToken.jwtToken
      return this.patientLogin(idToken)
    }
   }

  private async patientLogin(idToken?: string): Promise<boolean> {
    await this.sendRequest<LoginResponse>(url, data).pipe(
      tap(response => {
        if (!isLoginResponse(response)) {
          throw throwErr({ code: 'Generic' })
        }
        this.token = response.token
      })
    ).toPromise()
    return true
  }

Это дает мне ошибку Функция Asyn c не была завершена в течение 5000 мс

Я почти уверен, что это зависит от способа, которым я издеваюсь Усилить

Как правильно издеваться?

1 Ответ

1 голос
/ 28 февраля 2020

Попробуйте:

   it('should login', async (done) => {
      spyOn(myService, 'patientLogin'); // assuming it is a public function
      const objToBeReturned = { signInUserSession: { idToken: { jwtToken: 'tokenValue' } } }
      // Promise.resolve is optional but since it is returning a promise and we are awaiting it, I think we should do it here as well.
      spyOn(Amplify.Auth, 'signIn').and.returnValue(Promise.resolve(objToBeReturned));
      console.log('calling login');
      await myService.login('username', 'password');
      // fixture.whenStable() can be optional as well, but I think it will be good to wait for all promises to finish
      console.log('login resolved');
      await fixture.whenStable();
      expect(myService.patientLogin).toHaveBeenCalledWith('tokenValue');
      // call the done function to tell the test you are done, I think this is what you were missing
      done();
   })

====== Редактировать ===============

Вы должны выяснить, где тест застревает, я думаю, this.patientLogin(idToken) является асинхронным и застревает там. Посмотрите на console.logs, убедитесь, что вы видите login resolved. Основываясь на этой догадке, я подсмотрел patientLogin, и просто утверждаю, что это называется.

...