在 PhantomJS/Sinon 中存入 Promise

Stub a Promise in PhantomJS/Sinon

我在 jquery 中有一个 class 调用服务和 return 一个承诺,然后通过 .done 在我的主要区域执行,我正在尝试将该调用包装在另一个 class 中,我将确保不会对同一 ID 进行多次调用。但是我发现这很难测试,因为我无法准确地得到在 phantomJS/Sinon 中工作的承诺。这是我要测试的区域

LOCKER.execute(diagRunId, function (unlock) {
  SERVICE_ACCESSOR.makeCall params)
   .done(function (data) {
     console.log("Success!");
     unlock();
   })
   .fail(function (jqXHR, textStatus, errorThrown) {
     console.log("Failed!");
     unlock();
   });
});

并且在我的测试文件中我有我的 setup 这样的

var setup = function() {

    P.mock('service-accessor', function () {
        return {
            makeCall: sinon.stub().returns({})
        };
    });

    P.mock('locker', function () {
        var methods = {
            execute: function (lockId, wrapped) {
                console.log('locked - ' + lockId)
                wrapped()
            },
        unlock: sinon.stub()
        };
        return {
            execute: methods.execute,
            unlock: methods.unlock
        };
    });

    P.start();
}

最后测试只是调用方法

aui.suite('Locker Test', function () {

        aui.test('should lock and then unlock', testFile, {
            setup: setup,
            browser: function () {
                P.when('utils', 'service-accessor','locker').execute(
                    'test', function (SERVICE_ACCESSOR, LOCKER) {
                       
                        UTILS.makeCall("Identifier")
                        expect(LOCKER.unlock).to.have.been.called.once;
                        done();
                    }
                );
            },
            validate: function () {},
        });
});

储物柜工作并开始执行服务调用,但随后服务调用失败

     Error: PhantomJS: `TypeError: 'undefined' is not a function (evaluating 'SERVICE_ACCESSOR.callService( params).done')` near
L2492>          }).fail(function (jqXHR, textStatus, errorThrown) {

根据我的理解,我的模拟在被调用时应该 return 只是一个空对象,但后来我不明白 a) 为什么它会失败以及 b) 什么是未定义的?我的假设是,这是因为我没有 returning 三个对象,但我试图让它先成功!我怎样才能正确stub/mock这个?

最后我没有承诺,也没有使用存根。我使用了以下函数来代替调用 donefail

function() {
                return { done: function(callback) {
                    if(window.makeParamountCallSuccess) {
                        callback({"data": "data"});
                        return {
                            fail: function(){}
                        }
                    } else {
                        return {
                            fail: function(failCallback){ failCallback("jqXHR", "textStatus", "errorThrown")}
                        }
                    }
                   }
                }
            }```