javascript - 难以 mock Promise.all

标签 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
        });
    });

spy 似乎在工作 - 它正在调用“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 链的函数调用:

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 有关,因为我在监视常规 promise 时从来没有遇到过麻烦。有什么见解吗?

最佳答案

ES6 promise 未与 AngularJS 框架及其摘要循环集成。

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

代替 Promise.all,使用 $q.all method .

关于javascript - 难以 mock Promise.all,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45533966/

相关文章:

javascript - CSS 动画不适用于 animate.css 跨度

unit-testing - cakephp 单元测试模型,fixtures 问题

javascript - 这个-11从哪里来的?

javascript - 将 div 最初向右滚动,然后在溢出 div 内向左滚动

javascript - 将 .load html 文件的内容存储在变量中

css - Bootstrap 中的网格系统

Spring 测试 : How to enable auto-scan of beans

unit-testing - 找不到Gradle命令行 Assets 中的Libgdx测试

javascript - 在 Cloud Function 中按时间戳从 Cloud Firestore 查询

javascript - 如何将 slider 的值存储在变量中