我尝试使用angular2 rc1 为click
事件编写单元测试。我的组件使用onClick()
方法处理点击事件,并将name
字段从bar
更改为foo
。见plunker。
现在,我想触发click
事件来测试name
值是否为bar
。请参阅plunker上的unit-testing.spec.ts
文件。
it('should change name from foo to bar on click event', inject([], () => {
return builder.createAsync(UnitTestingComponentTestController)
.then((fixture: ComponentFixture<any>) => {
let query = fixture.debugElement.query(By.directive(UnitTestingComponent));
expect(query).toBeTruthy();
expect(query.componentInstance).toBeTruthy();
// fixture.detectChanges();
expect(query.componentInstance.name).toBe('foo');
query.triggerEventHandler('click',{});
expect(query.componentInstance.name).toBe('bar');
// fixture.detectChanges();
});
}));
这里是UnitTestingComponentTestController
@Component({
selector: 'test',
template: `
<app-unit-testing></app-unit-testing>
`,
directives: [UnitTestingComponent]
})
class UnitTestingComponentTestController {
}
此测试失败并显示以下消息:
Expected 'foo' to be 'bar'.
以下是triggerEventHandler()
triggerEventHandler(eventName: string, eventObj: any): void;
我的问题是如何触发事件并使用angular2进行测试。
一种解决方案可能是在onClick()
上调用componentInstance
方法,但在这种情况下,我们只测试类的内部,而不是组件行为
答案 0 :(得分:11)
阅读this文章后,现在我可以在测试中触发点击事件。这种方法不使用triggerEventHandler
。如果您的模板是这样的:
<div class="my-class" (click)="onClick()">
<ul id="my-id">
<li></li>
<li></li>
</ul>
</div>
您可以使用fixture.nativeElement.querySelector(<your selector>).click()
触发所选元素上的点击事件。此方法调用javascript click()
函数(请参阅this)
您可以根据id
,class
或路径(xpath?)选择元素。例如:
fixture.nativeElement.querySelector('.my-class').click()
或
fixture.nativeElement.querySelector('#my-id').click()
或
fixture.nativeElement.querySelector('div>ul>li').click()