Unit testing 茉莉花中的角承诺

Unit testing 茉莉花中的角承诺,unit-testing,angularjs,jasmine,promise,q,Unit Testing,Angularjs,Jasmine,Promise,Q,我有以下茉莉花测试: it('should resolve promise', inject(function ($q, $rootScope) { function getPromise(){ var deferred = $q.defer(); setTimeout(function(){ deferred.resolve(true); }, 1000); return deferred.pro

我有以下茉莉花测试:

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应该解决所有未兑现的承诺,但不知何故,它并没有发生在这个测试中


在这样的测试中,如何触发承诺解析?请帮忙

我认为在您的情况下,
$rootScope.$apply()
调用得太快了。这应该起作用:

函数getPromise(){ var deferred=$q.deferred(); setTimeout(函数(){ 延迟。解决(正确); $rootScope.$apply(); }, 1000); 回报。承诺; } 更新

您可以使用
$timeout.flush()
显式地注入和解析该承诺

it('should resolve promise',inject(函数($q,$timeout,$rootScope){
函数getPromise(){
var deferred=$q.deferred();
$timeout(函数(){
延迟。解决(正确);
}, 1000); 
回报。承诺;
}
// ...
$timeout.flush();
// ...

您使用的是angularJS 1.2的哪个版本?对于angularJS 1.2,承诺是A+兼容的,它们应该在不显式调用执行
$digest
循环的情况下解析。我使用的是Angular 1.2。我知道它们应该在摘要循环中解析。但是,它们没有:-(好吧,当我在解析后直接调用$apply时,它是有效的。但我认为这仍然是一种奇怪的行为。当我尝试在我的实际单元测试中使用相同的解决方案时(这里给出的解决方案只是为了测试$apply行为)它失败了。所以,似乎我仍然有一个问题!只有
$scope.$apply
起作用了,而不是
$timeout
?如果没有,我会将它从解决方案中删除。
$timeout
服务被
ngMock
(Doh!)模拟,并且需要显式调用
$timeout.flush()