Как имитировать методы усиления AWS в модульном тестировании Angular

Я использую AWS cognito , Amplify и Angular 10.

Я хочу, чтобы панель навигации не отображалась, если пользователь не вошел в систему:

приложение.html:

<ng-container *ngIf = "isLoggedIn">
  <navbar></navbar>
</ng-container>

app.ts:

constructor() {
  this.checkIfLoggedIn();
}

checkIfLoggedIn() {
  Auth.currentUserInfo().then((userData) => {
    if (userData) {
      this.isLoggedIn = true;
    }
  });
}

Это работает. Однако мои модульные тесты (Karma / Jasmine) выдают ошибку:

Error: Amplify has not been configured correctly.
        The configuration object is missing required auth properties.

Это потому, что я не знаю, как правильно высмеивать Auth.currentUserInfo.then (несмотря на то, что читал различные посты об этом, такие как это или то).

Попытки:

1) Шпионить

Я думал, что это будет что-то вроде spyOn(Auth, 'currentUserInfo').and.returnValue(Promise.resolve(true));

2) Мокинг Auth в провайдерах

как предложено в комментариях.

import { Auth } from 'aws-amplify';

beforeEach(async () => {
  await TestBed.configureTestingModule({
    declarations: [AppComponent],
    providers: [
      {
        provide: Auth,
        useValue: { currentUserInfo: () => Promise.resolve('hello') },
      },
    ],
  }).compileComponents();
}

К сожалению, они не устраняют сообщение об ошибке.

Аутентификация инициализируется, даже если вы за ней шпионили. Попробуйте в провайдерах {provide: Auth, useValue: { currentUserInfo: () => Promise.resolve(true) }}

Bojan Kogoj 11.12.2020 12:46

Большое спасибо за вашу помощь, я ценю это. К сожалению, это не сработало, я соответственно обновил свой вопрос.

user3255061 11.12.2020 13:36

Вы пробовали использовать useClass: MyClass вместо useValue?

Lucho 11.12.2020 19:28

Да. Это дает «недостижимую» ошибку, как описано здесь: stackoverflow.com/questions/62281756/…

user3255061 14.12.2020 21:19

Ок, неправильно использовал. Если я издеваюсь над службой (см. stackoverflow.com/a/62284218/3255061), нет «недоступного», но все еще есть «Ошибка: Amplify настроен неправильно. В объекте конфигурации отсутствует требуемая аутентификация». характеристики." ошибка.

user3255061 14.12.2020 21:29
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
5
1 501
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, Auth — это глобальный объект. Поэтому путь с spyOn(Auth, 'currentUserInfo').and.returnValue(Promise.resolve(true)); правильный, но его надо вызывать перед TestBed.configureTestingModule.

const backup: any;

// faking currentUserInfo
beforeEach(() => {
  backup = Auth.currentUserInfo;
  Auth.currentUserInfo = jasmine.createSpy()
    .and.returnValue(Promise.resolve(true));
});

// restoring original function
afterEach(() => {
  Auth.currentUserInfo = backup;
});

// now our test begins
beforeEach(async () => {
  await TestBed.configureTestingModule({
    declarations: [AppComponent],
  }).compileComponents();
});

Другие вопросы по теме