現在、私はプロバイダーをオーバーライドして、次のような模擬サービスを使用しています。
_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() })
を試しましたが、両方とも機能しませんでした。
declarations
のTestBed
にモックパイプを追加できます。
TestBed.configureTestingModule({
declarations: [
AppComponent,
MockPipe
],
...
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;
}
}
パイプをスタブするには、Dinistroの答えを使用します。パイプをスパイするには、次の方法で補完できます。
let pipeSpy: jasmine.Spy;
beforeEach(() => {
TestBed.configureTestingModule...
pipeSpy = spyOn(MockPipe.prototype, 'transform');
};
it('should do whatever', () => {
doYourStuff();
expect(pipeSpy).toHaveBeenCalled();
}
パイプをモックするための再利用可能なユーティリティ関数が必要な場合は、次のオプションを試すことができます。
export function mockPipe(options: Pipe): Pipe {
const metadata: Pipe = {
name: options.name
};
return <any>Pipe(metadata)(class MockPipe {});
}
そして、TestBed宣言配列内でこの関数を呼び出すだけです。
TestBed.configureTestingModule({
declarations: [
SomeComponent,
mockPipe({ name: 'myPipe' }),
mockPipe({ name: 'myOtherPipe' })
],
// ...
}).compileComponents();
パイプを次のような単純なクラスにモックする
export class DateFormatPipeMock {
transform() {
return '29.06.2018 15:12';
}
}
私のspecファイルでのuseClassの簡単な使用
providers: [
...
{provide: DateFormatPipe, useClass: DateFormatPipeMock}
...
]
私のために働いた:-)
MockPipe関数を使用できますが、以下のようにインポートする必要があります。
import 'MockPipe} from' mock-pipe ';
その後は、プロバイダーでモックパイプを定義するだけです。
プロバイダー:[
{提供:HighlightPipe、useValue:MockPipe(HighlightPipe、()=> 'mock')}]
それで全部です。