难以嘲笑Promise.all

时间:2017-08-06 16:08:01

标签: javascript angularjs unit-testing jasmine angular-promise

我想嘲笑这个功能:

    function getMetaData(key) {
        var deferred = $q.defer();
        var s3 = vm.initiateBucket();
        var params = {
            Bucket: constants.BUCKET_NAME,
            Key: key
        };
        s3.headObject(params, function(error, data) {
            if(error) {
                deferred.reject(error);
            }
            else {
                console.log(data);
                deferred.resolve(data.Metadata);
            }
        });
        return deferred.promise;
    };

我正在使用spyOn来模拟这个函数:

    spyOn(awsServices, 'getMetaData').and.callFake(function() {
        console.log("MOCKED");
        return $q.resolve({
            key: "MOCKED_KEY",
            description: "MOCK_DESCRIPTION",
            views: 1
        });
    });

间谍似乎正在工作 - 它正在调用“MOCKED”console.log。这是调用getMetaData:

的函数
function getPicsRadius(){
//Ommitted
    var promises = [];

    promises.push(awsServices.getMetaData(momentsInStates[i].Key)
      .then(function(metaData) {
        console.log(metaData);
        return {
            key: metaData.key,
            description: metaData.description,
            views: metaData.views
        };
    }))

}
return promise.all(promises);

这是由使用promise chaining的另一个函数调用的:

function getNearbyMoments() {   
    //omitted
    return calculateNearbyStates()
    .then(getPicsByState)
    .then(concatPics)
    .then(getPicsWithinRadius).then(function(){
        console.log("SHOULD LOG BUT IS NOT");
    });
}

最后的console.log没有打印。我得到的唯一错误是异步超时错误。所以它应该是getMetaData(MOCKED) - > getPicsRadius - > getNearbyMoments(不进入then函数)。我怀疑这与Promise.all有关,我正在回来,因为我从来没有遇到过违反常规承诺的麻烦。任何见解?

1 个答案:

答案 0 :(得分:2)

ES6承诺未与AngularJS框架及其摘要周期集成。

AngularJS通过提供自己的事件处理循环来修改正常的JavaScript流程。这将JavaScript拆分为经典和AngularJS执行上下文。只有在AngularJS执行上下文中应用的操作才能受益于AngularJS数据绑定,异常处理,属性监视等。

使用$q.all method

代替Promise.all