我已经进行了以下单元测试,测试我用Ionic 2编写的组件.单元测试给出了一个Ionic库的错误,我认为我没有正确地嘲笑它或者这样
import { ComponentFixture,async } from '@angular/core/testing'; import { TestUtils } from '../../test'; import {} from 'jasmine'; import { LocationSearchModal } from './LocationSearchModal'; import { LocationService } from '../../services/LocationService'; import { PouchDbService } from '../../services/common/PouchDbService'; import { FormsModule,ReactiveFormsModule } from '@angular/forms'; import { TestBed } from '@angular/core/testing'; import { App,MenuController,NavController,Platform,Config,Keyboard,Form,IonicModule,ViewController,GestureController,NavParams } from 'ionic-angular'; import { ConfigMock } from '../../mocks'; import { TranslateModule } from 'ng2-translate'; import { LoadingController } from 'ionic-angular'; let fixture: ComponentFixture<LocationSearchModal> = null; let instance: any = null; describe('LocationSearchModal',() => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ LocationSearchModal ],providers: [ App,LocationService,LoadingController,{ provide: ViewController,useClass: class { ViewController = jasmine.createSpy("viewController"); } },{ provide: NavParams,useClass: class { NavParams = jasmine.createSpy("navParams"); } },{ provide: PouchDbService,useClass: class { PouchDbService = jasmine.createSpy("pouchDbService"); } },{provide: Config,useClass: ConfigMock} ],imports: [ FormsModule,ReactiveFormsModule,TranslateModule.forRoot(),],}) .compileComponents() .then(() => { fixture = TestBed.createComponent(LocationSearchModal); instance = fixture.debugElement.componentInstance; fixture.autoDetectChanges(true); }); })); afterEach(() => { fixture.destroy(); }); it('loads',() => { expect(fixture).not.toBeNull(); expect(instance).not.toBeNull(); }) })
这是使用正在测试的组件中的ViewController的相关摘录.
this.locationService.getLocationById(this.selectedLocation) .subscribe((location: any) => { this.viewController.dismiss(location.doc) });
测试失败,我得到以下堆栈跟踪
Chrome 53.0.2785 (Linux 0.0.0) TypeError: viewCtrl._setHeader is not a function at new Header (webpack:///home/milinda/workspaces/eclipse/inspection/addedinspection/Inspection-Upgrade/~/ionic-angular/components/toolbar/toolbar.js:14:0 <- src/test.ts:11833:30) at new Wrapper_Header (/IonicModule/Header/wrapper.ngfactory.js:7:18)
这与我创建了jasmine间谍的ViewController行有关
{provide:ViewController,useClass:class {ViewController = jasmine.createSpy(“viewController”); },
我也尝试过编写自定义提供程序,但也得到了相同的错误.任何关于测试ViewController的正确方法的想法.
另外,有时在解决ViewController问题之后,NavParams可能会出现问题
@R_404_323@
以Marky Sparky的答案为基础.离子3:
export class ViewControllerMock{ readReady = { subscribe(){ } }; writeReady = { subscribe(){ } }; dismiss(){ console.log('View Controller Dismiss Called'); } _setHeader(){ } _setNavbar(){ } _setIONContent(){ } _setIONContentRef(){ } }
在版本上工作:
Cordova CLI: 6.5.0 Ionic Framework Version: 3.0.1 Ionic CLI Version: 3.0.0-beta7 ios-deploy version: 1.9.1 ios-sim version: Not installed OS: macOS Sierra Node Version: v7.8.0 Xcode version: Xcode 8.3.2 Build version 8E2002