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

时间:2016-06-18 22:04:09

标签: unit-testing angular

我尝试使用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方法,但在这种情况下,我们只测试类的内部,而不是组件行为

1 个答案:

答案 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

您可以根据idclass或路径(xpath?)选择元素。例如:

fixture.nativeElement.querySelector('.my-class').click()

fixture.nativeElement.querySelector('#my-id').click()

fixture.nativeElement.querySelector('div>ul>li').click()
相关问题