0
我正在開發一個測試例程,用於檢查是否在調用特定方法時調用某些方法。測試方法是否被promise回調調用
我正在使用茉莉花。
當我測試第一級時它的工作正常,但如果我調用第一級調用的回調函數內的另一個方法,茉莉花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();
}
});
}
}
任何人都可以幫我嗎?
它比我的代碼更簡單,但仍然無法正常工作。我在登錄回調中放了一些console.log,我發現樣本(你和我的)都調用了this.menu.enable方法。 – andercruzbr
好的,如果你用spyOn(authStub,'login')。和.returnValue(Promise.resolve(true))來轉換你的間諜呢? – trichetriche
同樣的行爲。我認爲問題是在spyOn(menuControllerStub,「啓用」),無法檢查方法是否被調用。 – andercruzbr