Test ideas:
The difficulty of the test also 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 recommendation: "angular tutorial"]
Tips: Jasmine test case determination, what are the methods, you can find it here, click on the component in my
, the 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 testing the return value undefined
const res = component.test(1,() => {})); expect(res).tobeUndefined();
Recommended practice:
# Use 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 are hiding, displaying, and for loops to 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. Add a custom component and add Custom directive @Component({ template: `<div> <image src="https://xxx.ss.png" ImageURlError></image> </div>` }) class TestHostComponent { } #2. Instantiate the custom component view and dispatch 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); //Just dispatch the event, and the error() method will be executed at this time});
Public modification in angular, spec.ts can Access; but private, protected modifications are not allowed;
knock on the blackboard
click event. The triggering of the click event can include direct js calling click, or imitating the mouse to trigger the 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 idea:
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
and then use fixture.nativeElement.querySelector('.card') to find the bound click element;
use triggerEventHandler('click');