Ana içeriğe geç

Angular testlerinde mock'ları nasıl özelleştirirsiniz

ng-mocks, deklarasyonları, sağlayıcıları ve klasik sınıfları taklit etmenin birçok yolunu sunar. Bu makalenin amacı, her yolun amacını açıklamak ve bunu detaylı bir şekilde tanımlamaya çalışmaktır.

ngMocks.defaultMock

ngMocks.defaultMock - tüm test takımları için deklarasyonlar, hizmetler ve token'lar için varsayılan mock davranışı sağlamak için faydalıdır. Örneğin, bir özelliği observable akış olan bir hizmetimiz var. Testlerde, hizmeti taklit ederken Cannot read property 'subscribe' of undefined gibi hatalardan kaçınmak istiyoruz.

Bunu şu şekilde yapabiliriz:

src/test.ts
ngMocks.defaultMock(MyService, () => ({
stream$: EMPTY,
}));

Artık MyService mock'ları, stream$ özelliğinde EMPTY akışına sahip olacak ve tüm abonelikleri artık hata vermeyecek. Daha fazla bilgi için ngMocks.defaultMock ile ilgili bölüme göz atabilirsiniz.


MockProvider

MockProvider - TestBed.configureTestingModule yapılandırırken bir hizmeti veya token'ı taklit etmek istediğimizde faydalıdır.

TestBed.configureTestingModule({
providers: [MockProvider(MyService)],
});

Ayrıca, ekstra özelleştirme için ikinci parametre olarak özel bir dilim geçebiliriz. Bu, ngMocks.defaultMock içerisinde tanımlanan tüm özelleştirmelerden sonra etkisini gösterir.

ipucu

MockProvider ile tanımlanan mock nesneleri, testlerinizde doğru ve etkili sonuçlar almak için oldukça faydalıdır.

TestBed.configureTestingModule({
providers: [
MockProvider(MyService, {
stream$: throwError(new Error('bozuk akış')),
}),
],
});

Bu, stream$ özelliğini geçersiz kılacak ve şimdi, ilgili testlerde tüm abonelikler bir hata alacaktır. Daha fazla bilgi için MockProvider ile ilgili bölüme göz atabilirsiniz.


MockInstance

MockInstance - belirli bir testte bir deklarasyon veya sağlayıcının davranışını özelleştirmemiz gerektiğinde faydalıdır. Örneğin, stream$ 'ın bir şey yayımlamasını istiyoruz.

not

MockProvider çağrısı MockRender veya TestBed.createComponent'ten önce yapılmalıdır.

it('test', () => {
const stream$ = new Subject();
MockInstance(MyService, () => ({
stream$,
}));
const fixture = MockRender(MyComponent);

stream$.next(true); // bir mock yayılımı.
fixture.detectChanges();
});

MockInstance davranışı özelleştirmenin sırasındaki en sonuncusudur ve MockProvider, MockBuilder.mock ve ngMocks.defaultMock sonrasında uygulanacaktır.

Daha fazla bilgi için MockInstance ile ilgili bölüme gözatabilirsiniz.


MockService

MockService - bir sınıfın mock örneğini oluşturmak gerektiğinde faydalıdır ve bu sınıf deklarasyonlara veya sağlayıcılara ait değildir.

Bir mock nesne MockService tarafından üretilmiş olan, orijinal sınıfına dayanmaktadır ve şunları sağlar:

  • tüm yöntemler boş (dummy)
  • tüm özellikler getter ve setter'lar aracılığıyla bağlanmıştır (bazı durumlarda çalışmayabilir, bu durumda ngMocks.stub kullanın)
  • otomatik casus ortamını dikkate alır

Örneğin, gerçek kopyasında inputElement özelliğine sahip olan bir mock bileşenimiz var ve bu özellik bir örneği HTMLInputElement içeriyor. Diğer bir bileşen, this.viewChildRef.inputElement.focus() gibi onu focus yapmaya çalışıyor ve bir diğeri blur yapmak istiyor vb. Ancak, testlerimizde bu aramalar sadece yan etkiler, bunları bastırmak istiyoruz.

MockService bu durumda parlıyor. Çünkü bu özelleştirme diğer testlerde de faydalı olabilir, bunu ngMocks.defaultMock aracılığıyla tanımlayalım. Ayrıca, isteğe bağlı ikinci parametresi, ekstra özelleştirme için örneğin bir dilim alır.

src/test.ts
ngMocks.defaultMock(MyComponent, () => ({
inputElement: MockService(HTMLInputElement, {
tagName: 'DIV',
}),
}));

Artık, MyComponent mock nesnesi her gerektiğinde, inputElement HTMLInputElement mock nesnesi olacak ve tüketicileri güvenle .focus(), .blur() ve diğer yöntemleri çağırabilir.


Özet

Bölümü özetlemek gerekirse:

  • ngMocks.defaultMock - deklarasyonların ve sağlayıcıların mock'larını küresel olarak özelleştirir.
  • MockProvider - deklarasyonların ve sağlayıcıların mock'larını süreçlerde özelleştirir.
  • MockInstance - deklarasyonların ve sağlayıcıların mock'larını testlerde özelleştirir.
  • MockService - her türlü sınıftan mock nesneleri oluşturur.

Özelleştirmenin önceliği:

  • İlk çağrılar ngMocks.defaultMock için gider.
  • İkinci çağrılar MockProvider ve MockBuilder.mock için gider.
  • Son çağrı ise MockInstance için gider.