带有承诺的单元测试:如何模拟 $q 或知道已调用 deferred

Unit test with promises: How to mock $q or know deferred has been called

我有一项使用承诺的服务。这是我的服务的一个简化示例:

angular.module('myService').service('popup', [
    '$q', function(
     $q ) {

    this.alert = function(myValue) {
        var deferred = $q.defer();

        if (myValue = 0) {
            deferred.resolve('myValue is null');
        } else {
            deferred.reject('myValue isn\'t null');
        }
        return deferred.promise;
    }
}]);

我想要这样的单元测试:

问题是,我知道因为 'deferred' 是我服务中的一个变量,所以我无法在我的单元测试中访问它(模拟它)。所以我需要模拟 $q,但我不知道该怎么做(我尝试了一些方法但没有成功)。

有人知道我如何模拟 $q 或者知道 deferred.resolve() 是否被调用了吗?

我不会嘲笑 $q,工作太多了。

我会做类似的事情:

it('Should be resolve when myValue is 0', function (){

    //given myValue = 0
    var myValue = 0;
    // calling myService.alert
    var promise = myService.alert(myValue);

    var resolved = false;
    promise.then(function (success){
       resolved = true; 
    }, function (error){

    });
    //actually resolve the promise
    $rootScope.$digest();

    //expect promise to have been resolved
    expect(resolved).toBe(true);
});