【问题标题】:When unit testing an Angular JS Promise's notify function, notify is never called在对 Angular JS Promise 的 notify 函数进行单元测试时,永远不会调用 notify
【发布时间】:2016-04-01 15:55:41
【问题描述】:

我有一个函数,当事情发生时使用通知来更新 UI:

promiseFunction.poll().then(
   function resolve() {},
   function reject() {},
   function notify() {
       console.log('Notify was called');
   }
);

还有一个单元测试试图模拟通知

it('will call notify', function () {
    sinon.stub(promiseFunction, 'poll', function () {
        var pollDeferred = $q.defer();
        pollDeferred.notify();
        return pollDeferred.promise;
    });

    systemUnderTest.run();
    $rootScope.$digest();

});

日志“通知被调用”永远不会被记录。为什么通知功能不会触发?

【问题讨论】:

  • 如果你改为调用 $rootScope.$apply() 会发生什么?
  • 同样的事情发生了。我现在实际上已经解决了,将添加答案

标签: javascript angularjs promise mocha.js notify


【解决方案1】:

好的,我最终解决了这个问题。考虑它是有道理的。通知没有解决并因此履行承诺,因此在承诺返回给调用者之前无法发送它。 $timeout 在这里拯救了,所以最终得到的单元测试代码是:

it('will call notify', inject(function ($timeout) {
    sinon.stub(promiseFunction, 'poll', function () {
        var pollDeferred = $q.defer();

        $timeout(function () {
            pollDeferred.notify();
        }, 0);

        return pollDeferred.promise;
    });

    systemUnderTest.run();
    $timeout.flush();
    $rootScope.$digest();
}));

【讨论】:

    猜你喜欢
    • 2015-06-30
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多