我在使用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
,但我能够测试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);
}));
答案 0 :(得分:3)
在单元测试课上试试这个:
beforeEachProviders(() => [WelcomePage, MenuController, provide(NavController, { useValue: WelcomePage })]);
然后:
import {provide} from '@angular/core';
答案 1 :(得分:1)
作为GoldBones,问题在于导入的NavController是一个类而不是提供者,因此您需要定义自己的提供者。 provide(...)
syntax is deprecated,但最终代码与旧语法非常相似:
beforeEachProviders(() => [WelcomePage, MenuController, {provide: NavController, useValue: {} }]);
我上面使用了一个空对象,但是当WelcomePage使用push
方法时,你需要用以下内容来解决这个问题:
let stubNavController = {push: (page) => {}};
beforeEachProviders(() => [WelcomePage, MenuController, {provide: NavController, useValue: stubNavController }]);
如果要测试方法是否被调用,那么使用像Sinon这样的间谍库可能会很有用。