2016-11-29 4 views
2

MIve hat die folgenden Komponententests, die eine Komponente testen, die ich in Ionic 2 geschrieben habe. Die Komponententests geben einen Fehler von einer der ionischen Bibliotheken, ich nehme an, dass ich es nicht richtig mokieren SolchIonic 2 ViewController Unit Test

Dies ist der relevante Auszug, der den ViewController von der Komponente verwendet, die getestet wird.

this.locationService.getLocationById(this.selectedLocation) 
     .subscribe((location: any) => { 
     this.viewController.dismiss(location.doc) 
     }); 

Der Test schlägt fehl, und ich erhalte die folgende Stack-Trace

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) 

Dies ist auf die ViewController Linie verwandt ist, das ich einen Jasmin Spion geschaffen für

{ provide: ViewController, useClass: class { ViewController = jasmine.createSpy("viewController"); } },

Nach Ein Blick auf die Codebasis Ich fand die _setHeader-Methode hier

https://github.com/driftyco/ionic/blob/6b3e2ed447340cdd35c328c96aa7cfa5f34eb214/src/navigation/view-controller.ts#L364

Ich habe auch versucht, einen benutzerdefinierten Anbieter zu schreiben, bekam aber den gleichen Fehler. Irgendeine Idee darüber, was die richtige Methode ist, den ViewController zu testen.

Zusätzlich manchmal nach der Lösung der Frage Viewcontroller ein Problem von NavParams auftreten kann vielleicht

Antwort

9

Aufbauend auf Marky Sparkys Antwort. Als ionischer 3+:

export class ViewControllerMock{ 
    readReady = { 
    subscribe(){ 

    } 
    }; 
    writeReady = { 
    subscribe(){ 

    } 
    }; 

    dismiss(){ 
    console.log('View Controller Dismiss Called'); 
    } 
    _setHeader(){ 

    } 
    _setNavbar(){ 

    } 
    _setIONContent(){ 

    } 
    _setIONContentRef(){ 

    } 
} 

Arbeiten an Version:

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 
+2

Von vorotung, gibt es in Mocks in ionischen auch gebaut: Import {MockApp, MockConfig, MockPlatform, MockView} von "ionic-angular/util/Mock-Provider"; und verwende es wie {provide: ViewController, useValue: mockView()}, – eesdil

3

ich hatte das gleiche Problem, wenn sie in Viewcontroller Unit-Tests beziehen. Ich habe es gerade gelöst. erstellen mock ähnlich

class ViewControllerMock { 
    public _setHeader(): any { 
    return {} 
    }; 
    public _setIONContent(): any { 
    return {} 
    }; 
    public _setIONContentRef(): any { 
    return {} 
    }; 
} 

dann zu Ihrem Anbieter im Gespräch noch es so TestBed.configureTestingModule:

TestBed.configureTestingModule({ 
    declarations: [ 
    ...components, 
    OrdinalPipe, 
    IgnoreNulls 
    ], 
    providers: [ 
    NavController, 
    ChartsService, FundsService, Utils, BlogService 
    , Payment, PlanHelper, Storage, PalIdle, SimpleExpiry, ContentService, PlansService, 
    App, Platform, Form, Keyboard, MenuController, 
    { provide: ModalController, useClass: ModalControllerMock }, 
    { provide: ViewController, useClass: ViewControllerMock }, 
    { provide: Config, useClass: ConfigMock } 
    ], 
    imports: [ 
    FormsModule, 
    IonicModule, 
    ReactiveFormsModule, 
    ], 
}) 

Dieser arbeitete für mich, wenn ich den viewCtrl._setHeader hatte, ist keine Funktionsfehler früher heute. Ich hoffe es hilft.

+0

Das neue Ionic 2.0 FINAL bricht diesen Spott. Genauer gesagt, diese Funktion aufruft this._viewCtrlReadSub = viewCtrl.readReady.subscribe (function() { _this._viewCtrlReadSub.unsubscribe(); _this._readDimensions(); }); –

0

akzeptierte Antwort nicht für ionische Version 3.9.2 funktioniert jedoch festgelegt nach der Ausgabe:

export class ViewControllerMock { 

    public readReady: any = { 
    emit(): void { 

    }, 
    subscribe(): any { 

    } 
    }; 

    public writeReady: any = { 
    emit(): void { 

    }, 
    subscribe(): any { 

    } 
    }; 

    public contentRef(): any { 
    return new Promise(function (resolve: Function): void { 
     resolve(); 
    }); 
    } 

    public didEnter(): any { 
    return new Promise(function (resolve: Function): void { 
     resolve(); 
    }); 
    } 

    public didLeave(): any { 
    return new Promise(function (resolve: Function): void { 
     resolve(); 
    }); 
    } 

    public onDidDismiss(): any { 
    return new Promise(function (resolve: Function): void { 
     resolve(); 
    }); 
    } 

    public onWillDismiss(): any { 
    return new Promise(function (resolve: Function): void { 
     resolve(); 
    }); 
    } 

    public willEnter(): any { 
    return new Promise(function (resolve: Function): void { 
     resolve(); 
    }); 
    } 

    public willLeave(): any { 
    return new Promise(function (resolve: Function): void { 
     resolve(); 
    }); 
    } 

    public willUnload(): any { 
    return new Promise(function (resolve: Function): void { 
     resolve(); 
    }); 
    } 

    public dismiss(): any { 
    return true; 
    } 

    public enableBack(): any { 
    return true; 
    } 

    public getContent(): any { 
    return true; 
    } 

    public hasNavbar(): any { 
    return true; 
    } 

    public index(): any { 
    return true; 
    } 

    public isFirst(): any { 
    return true; 
    } 

    public isLast(): any { 
    return true; 
    } 

    public pageRef(): any { 
    return true; 
    } 

    public setBackButtonText(): any { 
    return true; 
    } 

    public showBackButton(): any { 
    return true; 
    } 

    public _setHeader(): any { 
    return true; 
    } 

    public _setIONContent(): any { 
    return true; 
    } 

    public _setIONContentRef(): any { 
    return true; 
    } 

    public _setNavbar(): any { 
    return true; 
    } 

    public _setContent(): any { 
    return true; 
    } 

    public _setContentRef(): any { 
    return true; 
    } 

    public _setFooter(): any { 
    return true; 
    } 

} 

Ionic Info

cli packages: 

    @ionic/cli-plugin-proxy : 1.5.6 
    @ionic/cli-utils  : 1.14.0 
    ionic (Ionic CLI)  : 3.14.0 

local packages: 

    @ionic/app-scripts : 3.1.0 
    Ionic Framework : ionic-angular 3.9.2