Heim > Web-Frontend > js-Tutorial > Hauptteil

4 Tipps zum Schreiben von Angular-Unit-Tests, schauen Sie vorbei!

青灯夜游
Freigeben: 2022-08-17 20:26:58
nach vorne
2275 Leute haben es durchsucht

AngularWie führt man Unit-Tests durch? In diesem Artikel werde ich Ihnen 4 High-Level-Techniken zum Schreiben von Angular-Unit-Tests vorstellen. Ich hoffe, dass es Ihnen hilfreich sein wird!

4 Tipps zum Schreiben von Angular-Unit-Tests, schauen Sie vorbei!

Testideen:

  • 1. Wenn Unit-Tests möglich sind, versuchen Sie, Unit-Tests Vorrang zu geben.
  • 2 Wenn Unit-Tests nicht möglich sind, testen Sie den Test durch eine Kapselung in eine Komponente, aber es gibt Schwächer als Integrationstests
  • 3. Integrationstests
Wenn Sie das Testen vereinfachen möchten, sollten Sie während der Entwicklung Ihre Ideen bewusst klären und Code schreiben, der einfach und effizient ist ~.

Der in diesem Artikel verwendete Testtechnologie-Stack:
Angular12

+Jasmine Obwohl die Syntax anderer Testtechnologien unterschiedlich ist, ist die Gesamtidee ähnlich. [Verwandte Tutorial-Empfehlungen: „Angular-Tutorial“]

Tipps: Jasmine-Testfallbestimmung, welche Methoden gibt es, Sie finden sie hier,
Poke me

Unit-Test

Der Standardwert ist Komponente Die Instanz des zu testenden Objekts, die von Angular mit der folgenden Syntax erstellt wurde

beforeEach(() => { 
  fixture = TestBed.createComponent(BannerComponent); 
  component = fixture.componentInstance; 
  fixture.detectChanges(); 
});
Nach dem Login kopieren
Funktionstest

1 Funktionsaufruf ohne Rückgabewert

function test(index:number ,fn:Function){
 if(fn){
     fn(index);
 }
}
Nach dem Login kopieren

Wie teste ich?

Gegenbeispiel: Testen Sie direkt den Rückgabewert undefiniert

  const res = component.test(1,() => {}));
  expect(res).tobeUndefined();
Nach dem Login kopieren
Empfohlene Vorgehensweise:

 # 利用Jasmine
 it('should get correct data when call test',() =>{
     const param = {
       fn:() => {}
    }
   spyOn(param,'fn')
   component.test(1,param.fn);
   expect(param.fn).toHaveBeenCalled();
 })
Nach dem Login kopieren
Strukturanweisung HostListener-Test

Strukturanweisung, allgemeine Begriffe ausblenden, anzeigen und for-Schleife zum Anzeigen solcher Funktionen

 # code
 @Directive({ selector: '[ImageURlError]' })
export class ImageUrlErrorDirective implements OnChanges {
  constructor(private el: ElementRef) {}
  
  @HostListener('error')
  public error() { 
      this.el.nativeElement.style.display = 'none';
  } 
}
Nach dem Login kopieren
Wie testen?

Testidee:

Der Bildladefehler wird ausgelöst, dann finden Sie einen Weg, den Fehler auszulösen
  • Befehle werden im Allgemeinen an Komponenten angehängt, verwenden Sie einfach errorEvent unter dispath
  • #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()方法就会被执行到
    });
    Nach dem Login kopieren
Make Gute Verwendung der öffentlichen, privaten und geschützten Modifikatoren. In Angular kann auf spec.ts zugegriffen werden, wenn es öffentlich oder geschützt ist Tafel

Wenn Sie Unit-Tests und Testmethoden einzeln durchführen möchten, verwenden Sie bitte entsprechend öffentlich --- Schwierigkeitsgrad *

Wenn Sie nicht vorhaben, jede Methode zu testen, können Sie die Daten organisieren und den Eingang anrufen , und führen Sie die Methode durch Integrationstests – Schwierigkeit ***

Klickereignis testen

  • Klickereignisauslösung, es gibt direkte JS-Aufrufe zum Klicken und auch die Nachahmung der Maus, um das Klickereignis auszulösen.
  • # xx.component.ts
    @Component({
     selecotr: 'dashboard-hero-list'
    })
    class DashBoardHeroComponent {
        public cards = [{
            click: () => {
                .....
            }
        }]
    }
    # html
    <dashboard-hero-list [cards]="cards"  class="card">
    </dashboard-hero-list>`
    Nach dem Login kopieren
  • Wie testen?

Testidee:

Testen Sie die Komponente direkt, ohne Host zu verwenden

Verwenden Sie die Sammlung von Objekten, die vom Code zurückgegebene Klickereignisse enthalten, um Click nacheinander aufzurufen, sodass die Codeabdeckung verbessert wird

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);
});
Nach dem Login kopieren

Referenzideen für andere Klicks:

    Idee 1:
  • Verwenden Sie TestHostComponent, um die Komponente zu umschließen, die getestet werden muss
Dann verwenden Sie Fixture.nativeElement.querySelector('.card'), um das an das gebundene Klickelement zu finden Komponente;

DispatchEvent für das Element auslösen, das heißt Ja,

Idee 2:

  • Testen Sie die Komponente direkt, ohne Host zu verwenden
  • Verwenden Sie dann Fixture.nativeElement.querySelector('.card'), um zu finden das gebundene Klickelement;

    Verwenden Sie
  • triggerEventHandler

    ('click');

  • Weitere Kenntnisse zum Thema Programmierung finden Sie unter:

    Programmiervideo
  • ! !

Das obige ist der detaillierte Inhalt von4 Tipps zum Schreiben von Angular-Unit-Tests, schauen Sie vorbei!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!