如何在 Angular 单元测试中模拟 AWS 放大方法
How to mock AWS amplify methods in Angular unit testing
我正在使用 AWS cognito, Amplify and Angular 10.
我希望在用户未登录时不呈现导航栏:
app.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
(尽管阅读了各种关于它的帖子,例如 or that)。
尝试次数:
1) SpyOn
我以为会是这样的 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();
}
不幸的是,他们没有让错误消息消失。
看起来 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();
});
我正在使用 AWS cognito, Amplify and Angular 10.
我希望在用户未登录时不呈现导航栏:
app.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
我以为会是这样的 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();
}
不幸的是,他们没有让错误消息消失。
看起来 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();
});