Javascript 用间隔测试承诺

Javascript 用间隔测试承诺,javascript,angularjs,jasmine,Javascript,Angularjs,Jasmine,我正在用AngularJS编写服务。我需要能够测试此服务。除了一件外,我什么都做得很好。目前,我想测试的函数定义如下: return { triggerError: false, watchers: [], createWatcher : function (options) { var defer = $q.defer(); var watchId = Math.floor((Math.random() * 1000000) + 1); var dela

我正在用AngularJS编写服务。我需要能够测试此服务。除了一件外,我什么都做得很好。目前,我想测试的函数定义如下:

return {
  triggerError: false,
  watchers: [],

  createWatcher : function (options) {
    var defer = $q.defer();
    var watchId = Math.floor((Math.random() * 1000000) + 1);

    var delay = 10000;
    if (options && options.milliseconds) {
      delay = options.milliseconds;
    }

    this.watchers.push($interval(
      function() {
        if (this.triggerError) {
          defer.reject('There was an error watching.');
        }

        // Generate a random number
        var randomA = Math.floor((Math.random() * 50) + 1);
        var randomB = Math.floor((Math.random() * 50) + 1);
        var result = { a: randomA, b: randomB };
        defer.notify(result);   
      },
      delay
    ));

    return {
      watchId: watchId,
      promise: defer.promise 
    };
  }
}
顾名思义,此函数创建一个监视程序,该监视程序将在一段时间间隔内启动。之所以这样写,是因为我需要与正在使用的另一个框架保持一致。因此,我需要能够在代码中进行以下调用:

var watcher = myService.createWatcher({...});
watcher.promise.then(
  function() { ... },
  function(err) {},
  function(result) {
    console.log('A: ' + result.a);
    console.log('B: ' + result.b);
  }
)
我需要能够编写一个测试,将等待观察器触发10次。目前,我有以下几点:

it('should fire ten times', function(done) {
  var count = 0;
  var watch = myService.creationWatcher({});

  watch.promise.then(
    function() { console.log('here 1'); },
    function(err) { console.log('here 2'); },
    function(result) {
        count = count + 1;
    console.log(result);
    }
  );

  interval.flush(5000);
  rootScope.$digest();
});
我看到上面写着“这里1”。然而,我不确定我是否写错了测试,或者我的服务中是否遗漏了什么。在我看来,我的服务看起来是正确的。然而,我不确定测试本身。有人能告诉我我做错了什么吗?我不明白为什么我的测试不会等到观察者开火10次


谢谢大家!

您的测试延迟设置得太低。当你使用

interval.flush(100000)
相反,它应该可以工作——尽管看起来您的代码不会按原样运行,但我必须进行一些调整

我已经创建了一个示例,向您展示了它可以以更高的延迟工作(通过一些小的修复)。如果您将来有类似的问题,包括问题中的代码,还有一把小提琴将极大地帮助其他帮助您的人:-)


顺便说一句:我假设测试代码中的
creationWatcher()
是一个输入错误,实际调用的函数应该是
createWatcher()

您的
延迟=10000
间隔刷新(5000),这是一个错误吗?这把小提琴显示了我在控制台中所期望的。这个问题把我弄糊涂了,因为询问者说他看到了
“here1”
,尽管这是
成功
函数中的
。然后()
,但承诺从未得到解决。奇怪的