[英]Angular unit test click method isn't appearing to be clicked
這看起來應該很簡單,但我無法驗證是否在我的組件上調用了點擊處理程序。
header.component.ts
import { Component, EventEmitter, OnInit, Output } from '@angular/core';
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.scss']
})
export class HeaderComponent implements OnInit {
@Output() hamburgerToggle = new EventEmitter<void>();
constructor() {}
ngOnInit(): void {}
hamburgerClicked(): void {
this.hamburgerToggle.emit();
}
}
header.component.html
<nav class="sb-topnav navbar navbar-expand navbar-dark bg-dark">
<div class="hamburger header-toggle">
<button (click)="hamburgerClicked()" class="btn btn-link btn-sm order-first order-first header-toggle" id="sidebarToggle" href="/">
<i class="material-icons header-toggle">menu</i>
</button>
</div>
</nav>
header.component.spec.ts
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { HeaderComponent } from './header.component';
describe('HeaderComponent', () => {
let component: HeaderComponent;
let fixture: ComponentFixture<HeaderComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [HeaderComponent]
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(HeaderComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('clicking the toggle button invoke our click handler', () => {
const fixture = TestBed.createComponent(HeaderComponent);
const clickSpy = spyOn(component, 'hamburgerClicked');
const toggleButton = fixture.debugElement.query(By.css('#sidebarToggle'));
toggleButton.triggerEventHandler('click', toggleButton);
fixture.detectChanges();
expect(clickSpy).toHaveBeenCalledTimes(1);
});
});
給出的錯誤信息是:
Expected spy hamburgerClicked to have been called once. It was called 0 times.
我也在異步塊中嘗試過這個,但收到了相同的結果:
fit('clicking the toggle button invoke our click handler', fakeAsync(() => {
const fixture = TestBed.createComponent(HeaderComponent);
const clickSpy = spyOn(component, 'hamburgerClicked');
const toggleButton = fixture.nativeElement.querySelector('#sidebarToggle');
toggleButton.click();
tick();
fixture.detectChanges();
fixture.whenStable().then(() => {
expect(clickSpy).toHaveBeenCalledTimes(1);
});
}));
我已經在這幾個小時了,無法弄清楚我錯過了什么。 任何幫助深表感謝。
您在每個測試用例中創建一個新的fixture
(組件實例)。 但是您監視在beforeEach
中創建的組件。 因此,您在每個新組件實例上觸發 click 事件,它們不是同一個組件。
您應該添加一個 spy、查詢 DOM 元素並在同一個組件實例上觸發 click 事件。
在每個測試用例中刪除以下語句將起作用:
const fixture = TestBed.createComponent(HeaderComponent);
header.component.ts
:
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { HeaderComponent } from './header.component';
fdescribe('HeaderComponent', () => {
let component: HeaderComponent;
let fixture: ComponentFixture<HeaderComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [HeaderComponent],
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(HeaderComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('clicking the toggle button invoke our click handler', () => {
const clickSpy = spyOn(component, 'hamburgerClicked');
const toggleButton = fixture.debugElement.query(By.css('#sidebarToggle'));
toggleButton.triggerEventHandler('click', toggleButton);
expect(clickSpy).toHaveBeenCalledTimes(1);
});
it('clicking the toggle button invoke our click handler', () => {
const clickSpy = spyOn(component, 'hamburgerClicked');
const toggleButton = fixture.nativeElement.querySelector('#sidebarToggle');
toggleButton.click();
expect(clickSpy).toHaveBeenCalledTimes(1);
});
});
單元測試結果:
Chrome 80.0.3987.87 (Mac OS 10.13.6): Executed 2 of 17 (skipped 15) SUCCESS (0.1 secs / 0.045 secs)
TOTAL: 2 SUCCESS
✔ Browser application bundle generation complete.
✔ Browser application bundle generation complete.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.