3

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

}));
4

2 回答 2

3

在你的单元测试类上试试这个:

beforeEachProviders(() => [WelcomePage, MenuController, provide(NavController, { useValue: WelcomePage })]);

接着:

import {provide} from '@angular/core';
于 2016-06-21T11:11:47.590 回答
1

作为GoldBones,问题是已经导入的NavController是一个类而不是provider,所以需要自己定义provider。该provide(...) 语法已弃用,但最终代码与旧语法非常相似:

beforeEachProviders(() => [WelcomePage, MenuController, {provide: NavController, useValue: {} }]);

我在上面使用了一个空对象,但是由于 WelcomePage 使用了该push方法,您需要使用以下方法将其存根:

let stubNavController = {push: (page) => {}};
beforeEachProviders(() => [WelcomePage, MenuController, {provide: NavController, useValue: stubNavController }]);

如果您想测试该方法是否被调用,则使用像Sinon这样的间谍库可能会很有用。

于 2016-06-27T16:50:27.820 回答