2016-09-21 6 views
3

Ich versuche, einen Test für eine relativ isolierte Pipe zu implementieren. Ich verwende die neueste Version von angular-cli (mit @angular 2.0.0).Angular 2 - Winkel-Cli Pipe Test mit Abhängigkeiten

Der Rohrcode lautet:

import { Pipe, PipeTransform } from "@angular/core"; 
import { DatePipe, JsonPipe } from "@angular/common"; 

@Pipe({name: 'dataTableFormat'}) 
export class DataTablePipe implements PipeTransform { 

    // values with type 'json' are parsed to json. As a result, string values may be displayed with quotes ("<string>"). 
    // To avoid that, we remove these quotes with this regex 
    private quotesExp: RegExp = /^\"|\"$/gi; 

    constructor(private datePipe: DatePipe, private jsonPipe: JsonPipe) { 
    } 

    transform(value: string, type: string): string { 
    switch (type) { 
     case "date": 
      return this.datePipe.transform(value, 'short'); 
     case "json": 
      return this.jsonPipe.transform(value).replace(this.quotesExp, ""); 
     default: 
      return value; 
    } 
    } 
} 

und der Spec-Code ist:

import {TestBed} from "@angular/core/testing"; 
import {DataTablePipe} from "./data-table.pipe"; 
import {DatePipe, JsonPipe} from "@angular/common"; 

describe('DataTableFormat',() => { 

    beforeEach(() => { 
     TestBed.configureTestingModule({ 
      declarations: [ DataTablePipe ], 
      providers: [ 
       DatePipe, JsonPipe 
      ] 
     }); 
    }); 

    it('sanity',() => { 
     expect(true).toBeTruthy(); 
    }); 

    it('should transform ',() => { 
     let fixture = TestBed.createComponent(DataTablePipe); 
     let comp = fixture.componentInstance; 
     let testDate:Date = new Date(); 
     let datePipe = fixture.debugElement.injector.get(DatePipe); 

     expect(comp.transform(testDate.toString(), 'date')).toBe(datePipe.transform(testDate)); 

    }); 
}); 

Sanity Test bestanden, aber der wirkliche Test nicht mit dem Fehler:

Error: Cannot create the component DataTablePipe as it was not imported into the testing module! 
    at TestBed.createComponent (webpack:///Users/sninio/dev/csp-ui-ng/~/@angular/core/bundles/core-testing.umd.js:1144:0 <- src/main/js/test.ts:6022:23) 
    at Function.TestBed.createComponent (webpack:///Users/sninio/dev/csp-ui-ng/~/@angular/core/bundles/core-testing.umd.js:972:0 <- src/main/js/test.ts:5850:33) 
    at Object.<anonymous> (webpack:///Users/sninio/dev/csp-ui-ng/src/main/js/app/pages/+platform/events/data-table/data-table.pipe.spec.ts:23:30 <- src/main/js/test.ts:14770:41) 
    at ZoneDelegate.invoke (webpack:///Users/sninio/dev/csp-ui-ng/~/zone.js/dist/zone.js:203:0 <- src/main/js/test.ts:26741:28) 
    at ProxyZoneSpec.onInvoke (webpack:///Users/sninio/dev/csp-ui-ng/~/zone.js/dist/proxy.js:72:0 <- src/main/js/test.ts:18285:39) 
    at ZoneDelegate.invoke (webpack:///Users/sninio/dev/csp-ui-ng/~/zone.js/dist/zone.js:202:0 <- src/main/js/test.ts:26740:34) 
    at Zone.run (webpack:///Users/sninio/dev/csp-ui-ng/~/zone.js/dist/zone.js:96:0 <- src/main/js/test.ts:26634:43) 
    at Object.<anonymous> (webpack:///Users/sninio/dev/csp-ui-ng/~/zone.js/dist/jasmine-patch.js:91:27 <- src/main/js/test.ts:18021:50) 

I bin sicher, dass es eine Konfiguration ist, die ich verpasst habe, aber aus irgendeinem Grund wird die DataTablePipe nicht in th importiert e Testmodul ...

Irgendwelche Ideen?

Antwort

6

TestBed.createComponent ist ausschließlich zum Erstellen von Komponenten. Was Sie jedoch tun können, ist die DatePipe und JsonPipe in den Test injizieren. Erstellen Sie nur Rohr von denen

import { inject } from '@angular/core/testing'; 

it('should transform ', inject([DatePipe, JsonPipe], (datePipe, jsonPipe) => { 
    let pipe = new DataTablePipe(datePipe, jsonPipe); 
    let testDate: Date = new Date(); 

    expect(pipe.transform(testDate.toString(), 'date')) 
     .toBe(datePipe.transform(testDate, 'short')); 
})); 
+0

Dies funktioniert nicht, ich bekomme einen fehlenden Anbieter Fehler: Fehler: Kein Anbieter für DatePipe! in src/main/js/test.ts –

+1

funktionierte gut für mich, als ich getestet habe. Ich habe den genauen Code verwendet, den du gepostet hast. Ich habe nur die 'Deklarationen' aus dem' TestBed' entfernt. Ansonsten ist alles gleich, außer was ich in meiner Antwort geschrieben habe –

+0

Hast du es mit angular-cli getestet? Ich bin sicher, dass es einige Konfigurationen sind, die ich vermisse. –