Angular testlerinde pipe'ları nasıl mock'lanır
Angular testlerinde bir mock pipe MockPipe
fonksiyonu ile oluşturulabilir.
Fonksiyonun ikinci parametresi özel bir transform geri çağırma işlevini kabul eder.
Mock pipe, kaynak pipe ile aynı arayüze sahiptir, ancak tüm yöntemleri dummy'dir.
Bir testte bir mock pipe sağlamak için, bu kaynak pipe'ı MockPipe
fonksiyonuna geçirin.
TestBed.configureTestingModule({
declarations: [
// tek bir pipe için
MockPipe(Pipe),
// sahte transform geri çağırma
MockPipe(Pipe, value => JSON.stringify(value)),
// bir pipe kümesi için
...MockPipes(Pipe1, Pipe2),
],
});
Bir mock pipe’ın aşağıdaki özelliklere sahip:
- aynı
isim
e sahip - varsayılan transformu
() => undefined
olup, zincirleme sorunlarını önler bağımsız pipe'ları
destekler
Basit örnek
Bir Angular uygulamasında TargetComponent
'ın DependencyPipe
pipe'ına bağımlı olduğunu ve bunu mock pipe ile değiştirmek istediğimizi düşünelim.
Genellikle bir test şöyle görünür:
describe('Test', () => {
let component: TargetComponent;
let fixture: ComponentFixture<TargetComponent>;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [
// test için bileşenimiz
TargetComponent,
// can sıkıcı bağımlılık
DependencyPipe,
],
});
fixture = TestBed.createComponent(TargetComponent);
component = fixture.componentInstance;
});
});
Bir mock pipe oluşturmak için, yalnızca orijinal pipe'ı MockPipe
'a geçirin:
TestBed.configureTestingModule({
declarations: [
TargetComponent,
// kazanç
MockPipe(DependencyPipe, value => `mock:${value}`),
],
});
Ya da eğer profesyonel olmak istiyorsak, MockBuilder
, onun .mock
yöntemini kullanabiliriz ve MockRender
çağrısı yapabiliriz:
describe('Test', () => {
beforeEach(() => {
return MockBuilder(TargetComponent, ItsModule)
// DependencyPipe, ItsModule'deki bir beyan
.mock(DependencyPipe, value => `mock:${value}`);
});
it('oluşturulmalı', () => {
const fixture = MockRender(TargetComponent);
expect(fixture.point.componentInstance).toBeDefined();
expect(fixture.nativeElement.innerHTML).toContain('mock:foo');
// Gerekirse, fixture'dan DependencyPipe örneği.
const pipe = ngMocks.findInstance(DependencyPipe);
expect(pipe).toBeDefined();
});
});
Bağımsız pipe'lar
Angular 14'ten itibaren, pipe'lar bağımsız bir beyan olarak uygulanabilir.
ng-mocks
bunları algılar ve doğru bir şekilde mock'lar.
Bir bağımsız pipe'ı mock'lamak için, MockPipe
'ı imports içerisinde çağırmalısınız:
TestBed.configureTestingModule({
imports: [
// tek bir pipe için
MockPipe(StandalonePipe),
],
declarations: [
// test için bileşenimiz
TargetComponent,
],
});
MockBuilder
da bağımsız pipe'ları destekler ve onlarla doğru bir şekilde çalışır.
Gelişmiş örnek
Angular testlerinde pipe'ları mock'lama ile ilgili bir gelişmiş örnek. Kod içindeki yorumlara dikkat edin.
// Sahte bir transform fonksiyonu.
const fakeTransform = (...args: string[]) => JSON.stringify(args);
describe('MockPipe', () => {
// Pipe'ın nasıl çağrıldığını doğrulamak istersek
// bir spy.
const spy = jasmine.createSpy().and.callFake(fakeTransform);
// jest durumu için
// const spy = jest.fn().mockImplementation(fakeTransform);
beforeEach(() => {
return (
MockBuilder(TargetComponent, ItsModule)
// DependencyPipe, ItsModule'deki bir beyan
.mock(DependencyPipe, spy)
);
});
it('değerleri json\'a dönüştürmeli', () => {
const fixture = MockRender(TargetComponent);
expect(fixture.nativeElement.innerHTML).toEqual(
'<target>["foo"]</target>',
);
// Gerektiğinde, fixture'dan pipe örneğini bulabiliriz.
const pipe = ngMocks.findInstance(DependencyPipe);
expect(pipe.transform).toHaveBeenCalledWith('foo');
expect(pipe.transform).toHaveBeenCalledTimes(1);
});
});