如何在测试Component时模拟Pipe

har*_*han 33 unit-testing angular2-testing angular2-pipe angular

目前我重写提供者使用这样的模拟服务:

beforeEach(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => {
    tcb.overrideProviders(AddFieldToObjectDropdownComponent,
        [
             provide(ServiceA, { useClass: MockServiceA })),
             provide(ServiceB, { useClass: MockServiceB }))
        ])...
Run Code Online (Sandbox Code Playgroud)

我想对组件使用的管道做同样的事情.我试过了,provide(PipeA, { useClass: MockPipeA })provide(PipeA, { useValue: new MockPipeA() })但都没有奏效.

Din*_*tro 39

您可以在以下declarations位置添加模拟管道TestBed:

TestBed.configureTestingModule({
            declarations: [
                AppComponent,
                MockPipe
            ],
           ...
Run Code Online (Sandbox Code Playgroud)

MockPipe需求有@Pipe与原来的名字装饰.

import {Pipe, PipeTransform} from '@angular/core';

@Pipe({name: 'pipename'})
class MockPipe implements PipeTransform {
    transform(value: number): number {
        //Do stuff here, if you want
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法使用Jasmine监视模拟的管道?我正在尝试模拟翻译管道并检查它是否使用正确的翻译键调用. (4认同)

sho*_*ukh 20

如果你想要可重用的 util 函数来模拟管道,你可以试试这个选项:

export function mockPipe(options: Pipe): Pipe {
    const metadata: Pipe = {
      name: options.name
    };

    return <any>Pipe(metadata)(class MockPipe {});
}
Run Code Online (Sandbox Code Playgroud)

然后在 TestBed 声明数组中调用这个函数:

TestBed.configureTestingModule({
    declarations: [
        SomeComponent,
        mockPipe({ name: 'myPipe' }),
        mockPipe({ name: 'myOtherPipe' })
    ],
    // ...
}).compileComponents();
Run Code Online (Sandbox Code Playgroud)

  • 我在 Angular 11 上,这似乎不起作用。他们可能在内部改变了一些东西。我收到错误“TypeError:无法读取未定义的属性“调用”” (3认同)

Joã*_*des 13

要使管道存根,请使用Dinistro的答案.要监视管道,您可以使用以下内容进行补充:

let pipeSpy: jasmine.Spy;

beforeEach(() => {
    TestBed.configureTestingModule...

    pipeSpy = spyOn(MockPipe.prototype, 'transform');
};

it('should do whatever', () => {
    doYourStuff();

    expect(pipeSpy).toHaveBeenCalled();
}
Run Code Online (Sandbox Code Playgroud)

  • 另请注意:如果不需要 MockPipe,您可以对原始管道进行“spyOn” (4认同)

Koj*_*oja 9

一种可能性是使用ng-mocks 库并像这样使用它:

TestBed.configureTestingModule({
  declarations: [
    TestedComponent,
    MockPipe(ActualPipe, (...args) => args[0]),
  ]
}).compileComponents();
Run Code Online (Sandbox Code Playgroud)

MockPipe 的第二个参数定义了转换函数为 args 数组返回的内容。