[英]Angular 9 + jest : unit test, mock a promise and check method called then
[英]Test if method was called by promise callback
我正在开发一个测试例程,用于检查在调用特定方法时是否调用了某些方法。
我正在使用茉莉花。
当我测试第一级时它工作正常,但如果我在第一级调用的回调函数中调用另一个方法,茉莉花 spyOn 不起作用。
一个小例子,如果我的代码:
onLogin(form: NgForm) {
this.submitted = true;
if (form.valid) {
this.auth.login(this.login.username, this.login.password).then((value) => {
if(value) {
this.menu.enable(true, 'loggedInMenu');
this.menu.enable(true, 'loggedOutMenu');
this.navCtrl.setRoot(TabsPage);
} else {
let alert = this.alertCtrl.create({
title: 'Ops',
subTitle: 'Some things wrong.',
buttons: ['OK']
});
alert.present();
}
});
}
}
// Test Routine
describe("onLogin", () => {
it("makes expected calls when authentication successfully", () => {
const menuControllerStub = fixture.debugElement.injector.get(MenuController);
const authStub = fixture.debugElement.injector.get(Auth);
const ngFormStub = fixture.debugElement.injector.get(NgForm);
// it isn't works
spyOn(menuControllerStub, "enable").and.callFake(() => {});
// it's work fine
spyOn(authStub, "login").and.callFake((username:string, password: string) => {
return new Promise((callback, fallback) => {
callback(true);
});
});
comp.onLogin(ngFormStub);
// failed
expect(menuControllerStub.enable).toHaveBeenCalled();
// success
expect(autenticacaoStub.login).toHaveBeenCalled();
});
只是为了测试,我将两行代码移到外部回调,测试工作正常。 例如 :
onLogin(form: NgForm) {
this.submitted = true;
if (form.valid) {
this.menu.enable(true, 'loggedInMenu');
this.menu.enable(true, 'loggedOutMenu');
this.auth.login(this.login.username, this.login.password).then((value) => {
if(value) {
this.navCtrl.setRoot(TabsPage);
} else {
let alert = this.alertCtrl.create({
title: 'Ops',
subTitle: 'Some thing wrong.',
buttons: ['OK']
});
alert.present();
}
});
}
}
任何人都可以帮助我吗?
这是因为您返回了一个 Promise,但它从未被解决或拒绝。 尝试做
spyOn(authStub, "login").and.callFake((username:string, password: string) => {
return Promise.resolve(true);
});
编辑请试试这个:
let spy = spyOn(menuControllerStub, 'enable').and.returnValue(false);
// ...
expect(spy).toHaveBeenCalledTimes(2);
Promise 是异步的,其余的测试在 promise 被解决之前运行。
在您的情况下,在expect(menuControllerStub.enable).toHaveBeenCalled()
之前添加tick()
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.