Angular 2 – 具有依赖性的angular-cli管道测试

前端之家收集整理的这篇文章主要介绍了Angular 2 – 具有依赖性的angular-cli管道测试前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试为相对隔离的管道实施测试.我使用的是最新版本的angular-cli(带@angular 2.0.0).

管道代码是:

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没有导入测试模块……

有任何想法吗?

解决方法

TestBed.createComponent严格用于创建组件.你可以做的是将DatePipe和JsonPipe注入测试.只是创建你的管道

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

猜你在找的Angularjs相关文章