Home > Article > Web Front-end > 4 tips for writing Angular unit tests, come and take a look!
AngularHow to perform unit testing? In this article, I will share with you 4 high-level techniques for writing Angular unit tests. I hope it will be helpful to you!
Testing ideas:
The difficulty of the test gradually increases, and the more time it takes. If you want to make testing simple, then during development, you should consciously clarify your ideas and write code that is simple and efficient~.
The testing technology stack used in this article: Angular12 Jasmine. Although the syntax of other testing technologies is different, the overall idea is similar. [Related tutorial recommendations: "angular tutorial"]
Tips: Jasmine test case determination, what are the methods, you can find it here, Poke me
The component, by default, is the instance of the object to be tested created by Angular using the following syntax
beforeEach(() => { fixture = TestBed.createComponent(BannerComponent); component = fixture.componentInstance; fixture.detectChanges(); });
1. Function call with no return value
function test(index:number ,fn:Function){ if(fn){ fn(index); } }
How to test?
Counter example: Directly test the return value undefined
const res = component.test(1,() => {})); expect(res).tobeUndefined();
Recommended practice:
# 利用Jasmine it('should get correct data when call test',() =>{ const param = { fn:() => {} } spyOn(param,'fn') component.test(1,param.fn); expect(param.fn).toHaveBeenCalled(); })
Structure instructions, commonly used words hide, show, and for loop display such functions
# code @Directive({ selector: '[ImageURlError]' }) export class ImageUrlErrorDirective implements OnChanges { constructor(private el: ElementRef) {} @HostListener('error') public error() { this.el.nativeElement.style.display = 'none'; } }
How to test?
Test idea:
#1.添加一个自定义组件, 并添加上自定义指令 @Component({ template: `<div> <image src="https://xxx.ss.png" ImageURlError></image> </div>` }) class TestHostComponent { } #2.把自定义组件视图实例化,并派发errorEvent beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [ TestHostComponent, ImageURlError ] }); })); beforeEach(() => { fixture = TestBed.createComponent(TestHostComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should allow numbers only', () => { const event = new ErrorEvent('error', {} as any); const image = fixture.debugElement.query(By.directive(ImageURlError)); image.nativeElement.dispatchEvent(event); //派发事件即可,此时error()方法就会被执行到 });
angular If it is modified by public, spec.ts can be accessed; but if it is modified by private or protected, it cannot be accessed;
Knock on the blackboard
The click event is triggered by direct js call to click, or by imitating the mouse to trigger click. event.
# xx.component.ts @Component({ selecotr: 'dashboard-hero-list' }) class DashBoardHeroComponent { public cards = [{ click: () => { ..... } }] } # html <dashboard-hero-list [cards]="cards" class="card"> </dashboard-hero-list>`
How to test?
Testing ideas:
it('should get correct data when call click',() => { const cards = component.cards; cards?.forEach(card => { if(card.click){ card.click(new Event('click')); } }); expect(cards?.length).toBe(1); });
Other click reference ideas:
Idea 1:
Idea 2:
Test the component directly without using Host
Then use fixture.nativeElement.querySelector(' .card'), find the bound click element;
UsetriggerEventHandler('click');
Update For more programming related knowledge, please visit: programming video! !
The above is the detailed content of 4 tips for writing Angular unit tests, come and take a look!. For more information, please follow other related articles on the PHP Chinese website!