用西农和蓝鸟砸一个有前途的函数
Stubbing a promisified function with sinon and bluebird
在我要测试的文件中,我有以下代码:
var httpGet = Promise.promisify(require("request").get);
httpGet(endpoint, {
auth: {bearer: req.body.access_token},
json: true
})
.then(...)
现在,在我的测试中,我想确保 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);
//...
});
不幸的是,当request.get被承诺时,这不再有效。我尝试将 request.getAsync 改为存根(因为蓝鸟将"异步"附加到承诺的函数中),但这也不起作用。有什么想法吗?
Promise.promisify 不会修改对象,它只是接受一个函数并返回一个新函数,它完全不知道该函数甚至属于"request"
。
使用"全部"时,"Async"
后缀的方法添加到对象中
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();
仅供将来参考,我已经解决了一点不同的问题,我认为更干净一些。这是打字稿,但基本上是一回事。
fileBeingTested.ts
import * as Bluebird from 'bluebird';
import * as needsPromise from 'needs-promise';
const methodAsync = Bluebird.promisify(needsPromise.method);
export function whatever() {
methodAsync().then(...).catch(...);
}
test.spec.ts
import * as needsPromise from 'needs-promise';
import * as sinon form 'sinon';
const methodStub = sinon.stub(needsPromise, method);
import { whatever } from './fileBeingTested';
然后,使用methodStub
来管理发生的呼叫。你可以忽略它被承诺,只是管理它的正常行为。例如,如果您需要它出错。
methodStub.callsFake((arg, callback) => {
callback({ error: 'Error' }, []);
});
承诺的版本将抛出错误,你会得到它。
任何遇到这个的人。我有小型实用程序功能
function stubCBForPromisify(stub) {
let cbFn = function() {
let args = [...arguments];
args.shift();
return stub(...args);
};
return cbFn.bind(cbFn, () => ({}));
}
测试中
var getStub = sinon.stub().yields(null, {error: "test error", error_description: "fake google error."})
sinon.stub(require("request"), 'get', stubCBForPromisify(getStub))
expect(getStub).to.have.been.calledOnce();
我在使用 tape
和 proxyquire
测试时遇到了麻烦。我不确定人们正在使用什么模式/框架,允许他们直接修改required
request
对象,如接受的答案所示。就我而言,在我要测试的文件中,我require('jsonFile')
,然后调用bluebird.promisifyAll(jsonFile)
。在正常情况下,这会创建一个我要存根的readFileAsync
方法。但是,如果在测试期间我尝试使用 proxyquire
传入存根,则对 promisifyAll
的调用会覆盖我的存根。
我能够通过将promisifyAll
存根为无操作来解决此问题。如图所示,如果您依赖按原样创建某些异步方法,这可能太粗糙了。
core.js
:
var jsonFile = require('jsonfile');
var Promise = require('bluebird');
Promise.promisifyAll(jsonFile);
exports.getFile = function(path) {
// I want to stub this method during tests. It is
// created by promisifyAll
return jsonFile.readFileAsync(path);
}
core-test.js
:
var proxyquire = require('proxyquire');
var tape = require('tape');
var sinon = require('sinon');
require('sinon-as-promised');
tape('stub readFileAsync', function(t) {
var core = proxyquire('./core', {
'jsonfile': {
readFileAsync: sinon.stub().resolves({})
},
'bluebird': { promisifyAll: function() {} }
});
// Now core.getFile() will use my stubbed function, and it
// won't be overwritten by promisifyAll.
});
- D3.js:将一个有响应的饼图放在其父分区的中心
- 如何创建一个有空格的javascript对象
- 有前途的已经承诺的图书馆与蓝鸟
- 当我运行代码时,我得到以下结果 []对象对象] [对象对象],但应该给我一个有序数组
- Javascript:我怎么能强迫一个有十进制值的字符串使用点而不是逗号呢
- 制作一个有组织的列表/w javascript
- 在设计一个有角度的应用程序时出现了伪起始页
- 什么'最合适的数据结构是什么?(使用一个有间隙的数组是否存在缺点或注意事项?)
- Ember.js:如何表示一个有多个模型的关系
- 用西农和蓝鸟砸一个有前途的函数
- 这是一个有 2 个条件的条件语句,我需要添加第三个条件
- 当一个有小数而没有十进制时,JS减去数字
- 检查所有 li 如果一个有活动类,那么只有父 ul addclass
- 不能做一个有角度的原因ng控制器的帖子
- 给一个有1个变量/对象的函数给定几个参数
- 从一个有谷歌地图的地方获取lat和lng
- 有前途的听众
- 一个有角度的对象如何获得另一个对象的值
- 一个有内容的iFrame怎么可能有一个未定义的contentDocument对象
- Javascript-我创建了一个有多个值的表单,但只有一个值在计算