Sey*_*ini 5 unit-testing angular
我正在尝试click使用angular2 rc1为事件编写单元测试.我的组件使用onClick()方法处理click事件并将name字段从barto 更改为foo.看到这个plunker.
现在我想触发一个click事件来测试name值是否值bar.请参阅unit-testing.spec.tsplunker上的文件.
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();
});
}));
Run Code Online (Sandbox Code Playgroud)
这是 UnitTestingComponentTestController
@Component({
selector: 'test',
template: `
<app-unit-testing></app-unit-testing>
`,
directives: [UnitTestingComponent]
})
class UnitTestingComponentTestController {
}
Run Code Online (Sandbox Code Playgroud)
此测试失败并显示以下消息:
Expected 'foo' to be 'bar'.
Run Code Online (Sandbox Code Playgroud)
这是方法签名 triggerEventHandler()
triggerEventHandler(eventName: string, eventObj: any): void;
Run Code Online (Sandbox Code Playgroud)
我的问题是如何触发事件并使用angular2进行测试.
一种解决方案可能是调用onClick()方法,componentInstance但在这种情况下,我们只测试类的内部而不是组件行为
Sey*_*ini 11
看完这个文章,现在我可以触发点击事件在我的测试中.这种方法不使用triggerEventHandler.如果您的模板是这样的:
<div class="my-class" (click)="onClick()">
<ul id="my-id">
<li></li>
<li></li>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
您可以使用fixture.nativeElement.querySelector(<your selector>).click()触发所选元素上的click事件.这种方法调用javascript click()函数(见这个)
您可以根据其选择元素id,class或路径(XPath的?).例如:
fixture.nativeElement.querySelector('.my-class').click()
Run Code Online (Sandbox Code Playgroud)
要么
fixture.nativeElement.querySelector('#my-id').click()
Run Code Online (Sandbox Code Playgroud)
要么
fixture.nativeElement.querySelector('div>ul>li').click()
Run Code Online (Sandbox Code Playgroud)