angular.io上的单元测试示例

angular.io上的单元测试示例,angular,unit-testing,Angular,Unit Testing,在 难道不是这样吗 comp.selected.subscribe((hero: Hero) => { selectedHero = hero; expect(selectedHero).toBe(expectedHero); }); 这不可能是因为茉莉花的缘故 如果您这样做: it('should raise selected event when clicked', () => { let selectedHero: Hero; comp.selecte

难道不是这样吗

comp.selected.subscribe((hero: Hero) => {
  selectedHero = hero;
  expect(selectedHero).toBe(expectedHero);
});

这不可能是因为茉莉花的缘故

如果您这样做:

it('should raise selected event when clicked', () => {
    let selectedHero: Hero;
    comp.selected.subscribe((hero: Hero) => {
      selectedHero = hero;
      expect(selectedHero).toBe(expectedHero);
    });

    heroEl.triggerEventHandler('click', null);
});
而且,由于一个bug,没有捕获到事件
单击
,那么您的期望将永远不会被测试,您也不会失败


通过在
单击后测试
selectedHero
,测试确保如果没有处理单击事件,测试将失败,因为
selectedHero
将是
未定义的

确定,但它不应该在单击后立即运行expect,然后
selectedHero=hero?我认为您的错误是一个IDE警告,您可以通过添加
=null
selectedHero
声明中。期望值在事件触发器之后,因为
订阅
实际上并没有触发事件,它在这里接收触发此事件时的数据。这就是使用heroEl.triggerEventHandler('click',null)所做的一旦SobDescription被创建。是的,我也想到了。错误是由
strictNullChecks
引起的。但我不明白的是,当我们运行代码时,如果我们先运行expect,我们如何才能得到
selectedHero=hero
。它不应该是异步的吗?假设在500的组件中的事件处理程序中有一个debounceTime。它将始终运行expect first,然后运行'selectedHero=hero`否,因为
subscribe
调用相当于“当选中时将发出某些内容,请在我的selectedHero变量中设置它”,它不是实际的赋值。我认为它是实际的赋值。我刚测试了一下,去BounceTime设置为500。我需要用fakeAsync包装它,并使用tick(500),这样expect将正确运行。
it('should raise selected event when clicked', () => {
    let selectedHero: Hero;
    comp.selected.subscribe((hero: Hero) => {
      selectedHero = hero;
      expect(selectedHero).toBe(expectedHero);
    });

    heroEl.triggerEventHandler('click', null);
});