2016-09-21 95 views
3

我试图执行相对独立的Pipe测试。我正在使用angular-cli(与@angular 2.0.0)的最新版本。角度2 - 角度cli管道测试与依赖关系

管代码是:

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

和规范代码是:

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

    }); 
}); 

神智测试通过,但真正的测试失败,错误:

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) 

我肯定是我错过了一些配置,但由于某种原因,DataTablePipe没有导入到第e测试模块...

任何想法?

回答

6

TestBed.createComponent严格用于创建组件。你可以做的是将DatePipeJsonPipe注入测试。刚刚创建你从这些管道

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

这不起作用,我得到一个缺少提供者错误:错误:没有DatePipe提供程序!在src/main/js/test.ts中 –

+1

当我测试时,对我来说工作得很好。我使用了您发布的确切代码。我刚刚从'TestBed'中移除了'declarations'。除此之外,一切都是一样的,除了我在回答中发布的内容 –

+0

您是否使用angular-cli测试了它?我相信它是我缺少的一些配置 –