我在使用 NavController 进行单元测试时遇到问题。
我被这个错误困住了:
无法解析“NavController”的所有参数(?、?、?、?、?、?、?、?)。确保所有参数都用 Inject 修饰或具有有效的类型注释,并且“NavController”用 Injectable 修饰。
我尝试了我在网上找到的所有东西,比如使用“@Inject”,但似乎没有任何效果。
这是代码:
零件
import {Page, MenuController, NavController} from 'ionic-angular';
import {SignupPage} from '../signup/signup';
@Page({
templateUrl: 'build/pages/welcome/welcome.html'
})
export class WelcomePage {
// Variables
constructor(private menu: MenuController, private nav: NavController) {
this.menu.enable(false);
}
goToSignupPage() {
this.nav.push(SignupPage)
}
}
单元测试
import {beforeEachProviders, it, describe, expect, inject} from '@angular/core/testing';
import {MenuController, NavController} from 'ionic-angular';
import {WelcomePage} from './welcome';
describe('WelcomePage', () => {
beforeEachProviders(() => [WelcomePage, MenuController, NavController]);
it('should have the menu disabled on instatiation', inject([WelcomePage], (welcomePage) => {
// Expectations
expect(welcomePage.menu.isEnabled()).toBeFalsy();
}));
});
知道有什么问题吗?
更新:
感谢您的回复,伙计们。
它真的帮助我理解了如何去做。
我没有使用sinon
,但我能够测试是否使用来自 Jasmine的push
调用。spyOn
为此,我对该provide
部分进行了细微的更改:
beforeEachProviders(() => [WelcomePage, MenuController,
{ provide: NavController, useValue: {push: NavController.prototype.push} }]);
NavController.prototype
(可能直接提供服务以访问所有其他属性会很好。)
然后像这样测试:
it('should go to signup page when calling goToSignupPage()',
inject([WelcomePage], (welcomePage) => {
// Spies
spyOn(welcomePage.nav, 'push').and.stub();
// Call
welcomePage.goToSignupPage();
// Expectations
expect(welcomePage.nav.push).toHaveBeenCalledWith(SignupPage);
}));