ngMocks.faster
ngMocks.faster
özelliği, testler arasında benzer test modüllerinin kurulumunu optimize eder
ve yürütme sürelerini azaltır.
Bir durum düşünün ki beforeEach
birden fazla it
tarafından kullanılan aynı kurulumu yaratıyor.
Bu durumda ngMocks.faster
faydalı olabilir.
Bu durumda, beforeEach
yerine beforeAll
kullanın,
beforeAll
'dan önce ngMocks.faster
çağrısını yapın ve
Angular testleri daha hızlı çalışacaktır.
describe('performans:doğru', () => {
ngMocks.faster(); // <-- öncesinde ekleyin
// TestBed, testler arasında değiştirilmeyecek.
beforeAll(() => {
return MockBuilder(TargetComponent, TargetModule).keep(TargetService);
});
it('...', () => {
// ...
});
it('...', () => {
// ...
});
// ...
});
Eğer bir test beforeEach
içinde casus (spy) yaratıyorsa, bu ayarlanmalıdır,
çünkü ngMocks.faster
bu farkı tespit edecek ve bir bildirim gösterecektir.
Olası bir çözüm, manuel bildirim yerine MockInstance
kullanılmasıdır,
ya da casusların yaratılmasını beforeEach
dışına taşımaktır.
MockInstance Örneği
describe('beforeEach:mock-instance', () => {
ngMocks.faster(); // <-- öncesinde ekleyin
// TestBed'in normal kurulumu, TargetService onun mock nesnesi ile değiştirilecektir.
// MockBuilder'ın promise'ini döndürmeyi unutmayın.
// TargetService, ItsModule içinde bir sağlayıcıdır.
beforeEach(() => MockBuilder(TargetComponent, ItsModule));
// Mock TargetService'ın davranışını yapılandırma.
beforeAll(() => {
MockInstance(TargetService, {
init: instance => {
instance.method = jasmine.createSpy().and.returnValue(5);
// jest durumunda
// instance.method = jest.fn().mockReturnValue(5);
instance.prop = 123;
},
});
});
// Koşular arasında casusu sıfırlamayı unutmayın.
afterAll(MockReset);
});
beforeEach İçinde Casusları Optimize Etme Örneği
describe('beforeEach:manuel-casus', () => {
ngMocks.faster(); // <-- öncesinde ekleyin
// `beforeEach` dışında bir casus yaratmak, onun referansının
// testler arasında aynı olmasına olanak tanır ve bu, ngMocks.faster'ın işini yapmasına olanak tanır.
const mock = {
method: jasmine.createSpy().and.returnValue(5),
// jest durumunda
// method: jest.fn().mockReturnValue(5),
prop: 123,
};
// Koşular arasında casusu sıfırlamayı unutmayın.
beforeEach(() => {
mock.method.calls.reset();
// jest durumunda
// mock.method = jest.fn().mockReturnValue(5);
mock.prop = 123;
});
// TestBed'in normal kurulumu, TargetService onun mock nesnesi ile değiştirilecektir.
beforeEach(() => {
return MockBuilder(TargetComponent, ItsModule)
// TargetService, ItsModule içinde bir sağlayıcıdır.
.mock(TargetService, mock);
});
});
MockRender
ngMocks.faster()
kullanımı MockRender
için de geçerlidir.
Bu sayede, MockRender
, beforeEach
veya beforeAll
içinde çağrılabilir.
beforeAll
, bir testten sonra fixtures'i sıfırlamaz ve fixture, bir sonraki testte kullanılabilir.
Buna dikkat edin ki bileşenlerin durumu da aynı kalır.
describe('issue-488:hızlı', () => {
let fixture: MockedComponentFixture<TargetComponent>;
ngMocks.faster();
beforeAll(() => MockBuilder(TargetComponent, ItsModule));
beforeAll(() => (fixture = MockRender(TargetComponent)));
it('ilk test ilk render ile başlar', () => {
expect(ngMocks.formatText(fixture)).toEqual('1');
fixture.point.componentInstance.value += 1;
fixture.detectChanges();
expect(ngMocks.formatText(fixture)).toEqual('2');
fixture.point.componentInstance.reset();
fixture.detectChanges();
expect(ngMocks.formatText(fixture)).toEqual('0');
});
it('ikinci test önceki duruma devam eder', () => {
expect(ngMocks.formatText(fixture)).toEqual('0');
fixture.point.componentInstance.value += 1;
fixture.detectChanges();
expect(ngMocks.formatText(fixture)).toEqual('1');
fixture.point.componentInstance.reset();
fixture.detectChanges();
expect(ngMocks.formatText(fixture)).toEqual('0');
});
});