使用RxJS 5 debounceTime

时间:2017-06-28 14:28:54

标签: javascript angularjs testing jasmine rxjs

我有一个呈现标签和输入的组件 在$ postLink上,我将Overver添加到我的输入焦点,如果焦点事件被触发,我将内部变量focused设置为true

$postLink() { 
    Rx.Observable.fromEvent(myInputElement, 'focus')
      .debounceTime(200)
      .subscribe(() => {
      this.focused = true;
      this.$scope.$evalAsync();
    });
}

在我的测试文件中(我使用的是Jasmine),我有类似的东西:

it('must set "focused" to true when input get focused', () => {
  // The setupTemplate return a angular.element input, my component controller and scope
  const { input, controller, parentScope } = setupTemplate();
  input[0].dispatchEvent(new Event('focus'));
  $timeout.flush(600);
  parentScope.$digest();
  expect(controller.focused).toBe(true);
});

但是我的测试失败了。

如果我从我的组件方法中删除debounceTime,则测试通过。

我可以做些什么来模拟debounceTime

1 个答案:

答案 0 :(得分:0)

感谢@martin,我的测试是绿色的。

我刚刚在回调中添加了完成,并在 setTimeout

中调用
it('must set "focused" to true when input get focused', (done) => {
  const { input, controller, parentScope } = setupTemplate();
  input[0].dispatchEvent(new Event('focus'));
  setTimeout(() => {
    expect(controller.focused).toBe(true);
    done();
  }, 300);
});