测试具有服务依赖性的管道

Ben*_*ros 23 dependency-injection typescript angular2-testing angular angular-test

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

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

}
Run Code Online (Sandbox Code Playgroud)

我想测试它如下:

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

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

    it('create an instance', () => {
        expect(pipe).toBeTruthy();
    }); 
});
Run Code Online (Sandbox Code Playgroud)

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

constructor(private _sanitizer: DomSanitizer) {}
Run Code Online (Sandbox Code Playgroud)

目前我得到的是打字稿errror:

无法创建抽象类'DomSanitizer'的实例.

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

Jot*_*edo 36

由于管道中的DI,您需要配置测试环境(测试台)来解决依赖关系:

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();
  })); 
});
Run Code Online (Sandbox Code Playgroud)


Ala*_*ard 13

以防万一有人想重用 Pipe 的构造函数,您可以使用 TestBed 来实现相同的结果:

  let pipe: SafeHtmlPipe;
  let sanitized: DomSanitizer

  beforeEach(async() => {
    TestBed.configureTestingModule({
      providers: [DomSanitizer]
    });
    sanitized = TestBed.get(DomSanitizer);
    pipe = new SafeHtmlPipe(sanitized);
  });

  it('create an instance', () => {
    expect(pipe).toBeTruthy();
  });
Run Code Online (Sandbox Code Playgroud)

  • 但似乎“sanitized”不可用:“this.sanitizer.bypassSecurityTrustHtml 不是一个函数”。这是我尝试使用管道时出现的错误。 (3认同)
  • 好吧,据我所知,这不是方法的问题,这是因为无论出于何种原因,这个函数和其他函数都是静态的,因此,你不能在测试中这样调用它们。如果我没记错的话,如果您想测试方法调用,则需要像这样模拟它们:<pre><code>TestBed.configureTestingModule({imports: [BrowserModule],providers:[{provide:DomSanitizer, useValue: { 清理:() => 'safeString',bypassSecurityTrustHtml: () => 'safeString' } } ] });</code></pre> (2认同)