angular2 unit test:如何使用triggerEventHandler测试事件

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)