Actuellement, je force les fournisseurs à utiliser des services simulés comme ceci:
beforeEach(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => {
tcb.overrideProviders(AddFieldToObjectDropdownComponent,
[
provide(ServiceA, { useClass: MockServiceA })),
provide(ServiceB, { useClass: MockServiceB }))
])...
Je veux faire la même chose pour les tuyaux utilisés par le composant. J'ai essayé, provide(PipeA, { useClass: MockPipeA })
et provide(PipeA, { useValue: new MockPipeA() })
mais les deux n'ont pas fonctionné.
Vous pouvez ajouter vos recettes dans la declarations
de la TestBed
:
TestBed.configureTestingModule({
declarations: [
AppComponent,
MockPipe
],
...
La MockPipe
doit avoir le décorateur @Pipe
avec le nom d'origine.
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;
}
}
Pour écraser le tuyau, utilisez la réponse de Dinistro. Pour espionner le tuyau, vous pouvez le compléter avec ce qui suit:
let pipeSpy: jasmine.Spy;
beforeEach(() => {
TestBed.configureTestingModule...
pipeSpy = spyOn(MockPipe.prototype, 'transform');
};
it('should do whatever', () => {
doYourStuff();
expect(pipeSpy).toHaveBeenCalled();
}
Se moquer de ma pipe en classe simple comme
export class DateFormatPipeMock {
transform() {
return '29.06.2018 15:12';
}
}
et simple utilisation de useClass dans mon fichier de spécification
{provide: DateFormatPipe, useClass: DateFormatPipeMock}
a travaillé pour moi :-)