Angular 2 - 具有依赖关系的angular-cli管道测试

标签 angular karma-jasmine angular2-testing

我正在尝试对一个相对独立的Pipe 进行测试。我正在使用最新版本的 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 严格用于创建组件。不过,您可以将 DatePipeJsonPipe 注入(inject)到测试中。只是从那些创建你的管道

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

关于Angular 2 - 具有依赖关系的angular-cli管道测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39614513/

相关文章:

javascript - 如何从 Angular 中的动态 key 对值获取数据

angular - 在构造函数或 ngOnInit 中加载异步函数

unit-testing - 测试可观察对象 Angular 2 karma

angularjs - Jasmine 测试中的访问指令属性值

angular - 无法读取未定义的属性取消订阅 : Angular2 testing

Angular 2+ 服务测试。服务导入在 ng 测试运行时未定义

angular - RouteLink 测试 Angular2

javascript - CRUD 后重新加载页面

html - Angular 4 Material - mat-button 样式未应用于 mat-dialog 组件

javascript - 用 TypeScript 编写的 Geocoder 谷歌地图服务的 karma 异步测试