单元测试Ionic 2应用程序时,NavController出现问题

时间:2016-06-14 23:37:54

标签: unit-testing ionic2 injectable

我在使用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);

}));

2 个答案:

答案 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这样的间谍库可能会很有用。