58

現在、プロバイダーをオーバーライドして、次のようなモック サービスを使用しています。

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

コンポーネントが使用するパイプについても同じことをしたいと思います。試してみprovide(PipeA, { useClass: MockPipeA })ましprovide(PipeA, { useValue: new MockPipeA() })たが、どちらもうまくいきませんでした。

4

8 に答える 8

22

パイプをスタブするには、Dinistro の回答を使用します。パイプをスパイするには、次のように補完できます。

let pipeSpy: jasmine.Spy;

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

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

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

    expect(pipeSpy).toHaveBeenCalled();
}
于 2017-07-13T13:12:25.053 に答える
10

1 つの可能性は、ng-mocks ライブラリを使用して、次のように使用することです。

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

MockPipe の 2 番目の引数は、変換関数が引数の配列に対して返すものを定義します。

于 2019-10-18T12:42:03.647 に答える
-1

多くの場合、テンプレートでパイプを使用します。パイプをモックする方法は次のとおりです。パイプの名前は、モックしているパイプと同じでなければならないことに注意してください。

@Pipe({ name: 'myPipe' })
class MyPipeMock implements PipeTransform {
  transform(param) {
    console.log('mocking');
    return true;
  }
}

宣言のコンポーネントのテンプレートで使用している場合は、TestingModule を構成するときにパイプを含める必要があります。

于 2019-10-04T07:26:09.727 に答える