我在使用 NavController 进行单元测试时遇到问题。
我被这个错误困住了:
Cannot resolve all parameters for 'NavController'(?, ?, ?, ?, ?, ?, ?, ?). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'NavController' is decorated with 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
,但我能够测试是否调用了 push
使用来自 Jasmine 的 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);
}));
最佳答案
在你的单元测试类上试试这个:
beforeEachProviders(() => [WelcomePage, MenuController, provide(NavController, { useValue: WelcomePage })]);
然后:
import {provide} from '@angular/core';
关于unit-testing - 对 Ionic 2 应用程序进行单元测试时 NavController 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37823865/