与sinon和bluebird一起确定一个有希望的功能

Nep*_*oxx 11 javascript node.js promise sinon bluebird

在我想测试的文件中,我有以下代码:

var httpGet = Promise.promisify(require("request").get);
httpGet(endpoint, {
    auth: {bearer: req.body.access_token},
    json: true
})
    .then(...)
Run Code Online (Sandbox Code Playgroud)

现在,在我的测试中,我想确保httpGet被调用一次,并确保参数有效.在被宣传之前,我的测试看起来像这样:

beforeEach(function () {
    request.get = sinon.stub()
        .yields(null, null, {error: "test error", error_description: "fake google error."});
});

afterEach(function () {
    expect(request.get).to.have.been.calledOnce();
    var requestArgs = request.get.args[0];
    var uri = requestArgs[0];

    expect(uri).to.equal(endpoint);
    //...
});
Run Code Online (Sandbox Code Playgroud)

不幸的是,当request.get被宣传时,这不再有效.我尝试了stubing request.getAsync(因为bluebird将"Async"附加到promisified函数),但这也不起作用.有任何想法吗?

Esa*_*ija 5

Promise.promisify不会修改对象,它只接受一个函数并返回一个新函数,完全不知道该函数甚至属于"request"

"Async"使用promisify All时,将后缀方法添加到对象

Promise.promisifyAll(require("request"));

request.getAsync = sinon.stub()
        .yields(null, null, {error: "test error", error_description: "fake google error."});

expect(request.getAsync).to.have.been.calledOnce();
Run Code Online (Sandbox Code Playgroud)