Я использую 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();
}
К сожалению, они не устраняют сообщение об ошибке.
Большое спасибо за вашу помощь, я ценю это. К сожалению, это не сработало, я соответственно обновил свой вопрос.
Вы пробовали использовать useClass: MyClass
вместо useValue?
Да. Это дает «недостижимую» ошибку, как описано здесь: stackoverflow.com/questions/62281756/…
Ок, неправильно использовал. Если я издеваюсь над службой (см. stackoverflow.com/a/62284218/3255061), нет «недоступного», но все еще есть «Ошибка: Amplify настроен неправильно. В объекте конфигурации отсутствует требуемая аутентификация». характеристики." ошибка.
Похоже, 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();
});
Аутентификация инициализируется, даже если вы за ней шпионили. Попробуйте в провайдерах
{provide: Auth, useValue: { currentUserInfo: () => Promise.resolve(true) }}