angular - 测试依赖于服务的管道

标签 angular typescript dependency-injection angular2-testing angular-test

我有一个 sanatises HTML 的管道,如下所示:

import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';

@Pipe({
    name: 'sanitiseHtml'
})

export class SanitiseHtmlPipe implements PipeTransform {

constructor(private _sanitizer: DomSanitizer) {}

    transform(value: any): any {
      return this._sanitizer.bypassSecurityTrustHtml(value);
    }

}

我想测试如下:

describe('Pipe: Sanatiser', () => {
    let pipe: SanitiseHtmlPipe;

    beforeEach(() => {
        pipe = new SanitiseHtmlPipe(new DomSanitizer());
    });

    it('create an instance', () => {
        expect(pipe).toBeTruthy();
    }); 
});

DomSanatizer 是一个抽象类,通过将其传递给构造函数由 typescript Autowiring :

constructor(private _sanitizer: DomSanitizer) {}

目前我得到 typescript 错误:

Cannot create an instance of the abstract class 'DomSanitizer'.

有谁知道在 Angular 中实例化传递给构造函数的依赖项时 typescript 会做什么?或者测试这样的东西的方法是什么?

最佳答案

由于你管道中的DI,你需要配置一个测试环境(test bed)来解决依赖:

import { BrowserModule, DomSanitizer } from '@angular/platform-browser';
import { inject, TestBed } from '@angular/core/testing';

describe('SanitiseHtmlPipe', () => {
  beforeEach(() => {
    TestBed
      .configureTestingModule({
        imports: [
          BrowserModule
        ]
      });
  });

  it('create an instance', inject([DomSanitizer], (domSanitizer: DomSanitizer) => {
    let pipe = new SanitiseHtmlPipe(domSanitizer);
    expect(pipe).toBeTruthy();
  })); 
});

关于angular - 测试依赖于服务的管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47514436/

相关文章:

unit-testing - 如何为 vscode 扩展做 Coverage 导出

typescript `Property is missing in type` ,但类型是 `never`

c++ - 可以对 C++ obj 文件进行单元测试吗?

angular - 当 Angular 中 ID 相等时合并两个可观察量

html - Google 分析跟踪器未在 ionic 2 应用程序中启动

javascript - 如何根据当前组件隐藏/显示组件?

javascript - 如何在到期前知道日期

typescript - 如何期望字符串以指定的变量开头

wpf - 在 wpf MVVM 应用程序上使用 Unity 进行依赖注入(inject)

Angular:使用构造函数注入(inject)服务的替代方案