2017-02-01 4 views
3

Я своего рода новый для модульного тестирования в угловых 2 и ионического 2.Ионные 2 NavController модульное тестирование

Я пытаюсь проверить метод login() ниже

export class LoginPage { 

    constructor(public navCtrl: NavController) {} 

    login() { 
    this.navCtrl.setRoot(TabsPage); 
    } 
} 

С следующим испытанием

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); 
    }); 
}); 

Но я получаю следующую ошибку

Error: <spyOn> : setRoot() method does not exist 

Я следил за this tutorial для настройки.

Должно быть, что-то не хватает. Является ли instance.navCtrl правильной вещью, чтобы шпионить за ней?

+0

Вы можете отлаживать тест в Chrome и осмотрите его (как вы могли бы сделать бегущую приложение). Я не могу понять это, глядя на код. Нажмите DEBUG в карме, выполните ошибку в консоли и добавьте точку останова. Проверьте instance.navCtrl и посмотрите, почему отсутствует setRoot. Если вы издеваетесь над NavController, убедитесь, что mock имеет setRoot. – lathonez

+0

Привет, можем ли мы установить шпиона на login()? Если да, то как? – Aditya

+0

Да, вы можете сделать это так же, как я установил шпион на 'this.navCtrl.setRoot()' выше. В одном из ваших тестов сделайте что-то вроде этого: 'spyOn (instance, 'login')'. Если вам нужна дополнительная помощь или если это не сработает, не стесняйтесь задавать новый вопрос о SO и делиться своим кодом! – emroussel

ответ

2

Это закончилось тем, что это опечатка. Я использовал useValue вместо useClass в представлении, поэтому к методу setRoot нужно было пройти через прототип.

Я имел

{provide: NavController, useValue: NavMock} 

Вместо

{provide: NavController, useClass: NavMock}