Настройка TDD в ionic2
Я следовал руководству Джошуа Морони по Ionic2 и TDD, но застрял при попытке отладки ошибок по мере их возникновения.
Базовый пример:
import { TestBed, ComponentFixture, async } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';
import { IonicModule, NavController } from 'ionic-angular';
import { MyApp } from '../../app/app.component';
import { TabsPage } from './tabs';
let comp: TabsPage;
let fixture: ComponentFixture<TabsPage>;
let de: DebugElement;
let el: HTMLElement;
describe('Page: Tabs Page', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyApp, TabsPage],
providers: [
NavController
],
imports: [
IonicModule.forRoot(MyApp)
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(TabsPage);
comp = fixture.componentInstance;
});
afterEach(() => {
fixture.destroy();
comp = null;
de = null;
el = null;
});
it('is created', () => {
expect(fixture).toBeTruthy();
expect(comp).toBeTruthy();
});
});
Выход из кармы:
FAILED TESTS:
Page: Tabs Page
✖ is created
PhantomJS 2.1.1 (Mac OS X 0.0.0)
Chrome 57.0.2987 (Mac OS X 10.12.3)
TypeError: this.parent.unregisterChildNav is not a function
at Tabs.ngOnDestroy (webpack:///~/ionic-angular/components/tabs/tabs.js:220:0 <- src/test.ts:56626:21)
at callProviderLifecycles (webpack:///~/@angular/core/@angular/core.es5.js:11109:0 <- src/test.ts:11389:18)
at callElementProvidersLifecycles (webpack:///~/@angular/core/@angular/core.es5.js:11078:0 <- src/test.ts:11358:13)
at callLifecycleHooksChildrenFirst (webpack:///~/@angular/core/@angular/core.es5.js:11062:0 <- src/test.ts:11342:17)
at destroyView (webpack:///~/@angular/core/@angular/core.es5.js:12280:0 <- src/test.ts:12560:5)
at callViewAction (webpack:///~/@angular/core/@angular/core.es5.js:12391:0 <- src/test.ts:12671:13)
at execComponentViewsAction (webpack:///~/@angular/core/@angular/core.es5.js:12333:0 <- src/test.ts:12613:13)
at destroyView (webpack:///~/@angular/core/@angular/core.es5.js:12279:0 <- src/test.ts:12559:5)
at callWithDebugContext (webpack:///~/@angular/core/@angular/core.es5.js:13060:25 <- src/test.ts:13340:42)
at Object.debugDestroyView [as destroyView] (webpack:///~/@angular/core/@angular/core.es5.js:12614:0 <- src/test.ts:12894:12)
at ViewRef_.destroy (webpack:///~/@angular/core/@angular/core.es5.js:10199:0 <- src/test.ts:10479:18)
at ComponentRef_.destroy (webpack:///~/@angular/core/@angular/core.es5.js:9944:51 <- src/test.ts:10224:67)
at ComponentFixture.destroy (webpack:///~/@angular/core/@angular/core/testing.es5.js:248:0 <- src/test.ts:40179:31)
at Object.<anonymous> (webpack:///src/pages/tabs/tabs.spec.ts:40:16 <- src/test.ts:110812:17)
at ZoneDelegate.invoke (webpack:///~/zone.js/dist/zone.js:365:0 <- src/test.ts:123570:26)`
Это тестирование одного компонента без каких-либо сложностей:
import { Component } from '@angular/core';
@Component({
templateUrl: 'tabs.html'
})
export class TabsPage {
constructor() {
}
}
Может кто-нибудь указать мне на учебник о том, как решить эти проблемы; не просто предоставить решение для этой единственной проблемы?
Спасибо,
Энди
1 ответ
Я столкнулся с той же проблемой. Согласно ионным документам, "каждая отдельная ионная вкладка является декларативным компонентом для NavController". Поэтому вам нужно использовать провайдера для NavController, а затем использовать фиктивный класс в качестве класса. Там вам нужно определить функцию для регистрации и одну для отмены регистрации компонента ChildNav. См. Также: https://github.com/ionic-team/ionic/blob/master/src/navigation/nav-controller.ts Я использовал в качестве класса базовый класс, предоставленный Джошем Морони, и расширил его, включив в него:
public registerChildNav(nav: any) {
// do nothing
}
public unregisterChildNav(nav: any) {
// do nothing
}
Страница спецификации вкладок содержит следующие связанные записи (я помещаю свои макеты в каталог test-mocks на том же уровне, что и каталог src):
import { NavController } from 'ionic-angular';
import { NavMock } from '../../../test-mocks/mocks';
providers: [
//NavController,
{
provide: NavController,
useClass: NavMock
},
]
Это должно сделать это.