Ionic 2 NavController单元测试

emr*_*sel 3 unit-testing ionic2 angular

我有点喜欢Angular 2和Ionic 2中的单元测试。

我正在尝试测试login()下面的方法

export class LoginPage {

  constructor(public navCtrl: NavController) {}

  login() {
    this.navCtrl.setRoot(TabsPage);
  }
}
Run Code Online (Sandbox Code Playgroud)

通过以下测试

import { ComponentFixture, async } from '@angular/core/testing';
import { TestUtils } from '../../test';
import { LoginPage } from './login';
import { TabsPage } from '../tabs/tabs';

let fixture: ComponentFixture<LoginPage> = null;
let instance: any = null;

describe('Login Page', () => {

  beforeEach(async(() => TestUtils.beforeEachCompiler([LoginPage]).then(compiled => {
    fixture = compiled.fixture;
    instance = compiled.instance;
  })));

  it('changes root nav to TabsPage on login()', () => {
    spyOn(instance.navCtrl, 'setRoot');
    instance.login();
    expect(instance.navCtrl.setRoot).toHaveBeenCalledWith(TabsPage);
  });
});
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误

Error: <spyOn> : setRoot() method does not exist
Run Code Online (Sandbox Code Playgroud)

我按照本教程进行设置。

我肯定错过了什么。instance.navCtrl监视是正确的事情吗?

emr*_*sel 5

它最终是一个错字。我使用的是useValue而不是useClass在Provide中,因此必须通过原型访问setRoot方法。

我有

{provide: NavController, useValue: NavMock}
Run Code Online (Sandbox Code Playgroud)

代替

{provide: NavController, useClass: NavMock}
Run Code Online (Sandbox Code Playgroud)