【问题标题】:Angular promise not resolving in jasmine茉莉花中没有解决的角承诺
【发布时间】:2023-04-06 00:55:01
【问题描述】:

我有以下茉莉花测试:

it('should resolve promise', inject(function ($q, $rootScope) {

    function getPromise(){
        var deferred = $q.defer();
        setTimeout(function(){
            deferred.resolve(true);
        }, 1000);
        return deferred.promise;
    }

    var p = getPromise();
    var cb = jasmine.createSpy();

    runs(function(){
        expect(cb).not.toHaveBeenCalled();

        p.then(cb);

        $rootScope.$apply();
    });

    waitsFor(function(){
        return cb.callCount == 1;
    });

    runs(function(){
        expect(cb).toHaveBeenCalled();

        $rootScope.$apply();
    });

}));

我认为 $rootScope.$apply 应该解决所有未完成的承诺,但不知何故,它在这个测试中没有发生。

如何在这样的测试中触发 Promise 解析?请帮忙!

【问题讨论】:

  • 您使用的是哪个版本的 Angular?在 angularJS 1.2 中,promise 符合 A+,并且它们应该在没有显式调用执行 $digest 循环的情况下解决。
  • 我正在使用 Angular 1.2。好吧,我知道他们应该在摘要循环中解决。但是,他们没有。 :-(
  • 好吧,当我在解决后直接调用 $apply 时,它可以工作。但我认为这仍然是奇怪的行为。当我尝试在我的真实单元测试中使用相同的解决方案时(这里介绍的只是用于测试 $apply 行为)它失败了。所以,看来我还是有问题!
  • 只有$scope.$apply 工作而不是$timeout?如果没有,我会将其从解决方案中删除。
  • 那个铃声响了。 $timeout 服务被 ngMock 模拟(Doh!),并且需要明确调用 $timeout.flush(): plnkr.co/edit/Bdh78ZiArbO8vau9ByVJ?p=preview

标签: unit-testing angularjs jasmine promise q


【解决方案1】:

我认为在您的情况下,$rootScope.$apply() 被调用得太早了。这应该有效:

function getPromise(){
    var deferred = $q.defer();
    setTimeout(function(){
        deferred.resolve(true);
        $rootScope.$apply();
    }, 1000);
    return deferred.promise;
}

更新

您可以注入 mock $timeout service 并使用 $timeout.flush() 显式解决其中的承诺。

it('should resolve promise', inject(function ($q, $timeout, $rootScope) {

    function getPromise(){
        var deferred = $q.defer();
        $timeout(function(){
            deferred.resolve(true);
        }, 1000); 
        return deferred.promise;
    }

    // ...

    $timeout.flush();

    // ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多