【发布时间】:2017-11-01 19:31:15
【问题描述】:
我正在想办法在这个模块中模拟 redis:
const Redis = require('ioredis');
const myFunction = {
exists: (thingToCheck) {
let redis_client = new Redis(
6379,
process.env.REDIS_URL,
{
connectTimeout: 75,
dropBufferSupport: true,
retryStrategy: functionHere
});
redis_client.exists(thingToCheck, function (err, resp) {
// handlings in here
});
}
};
使用这个测试代码:
const LambdaTester = require('lambda-tester');
const chai = require('chai');
const expect = chai.expect;
const sinon = require('sinon');
const mockRedis = sinon.mock(require('ioredis'));
describe( 'A Redis Connection error', function() {
before(() => {
mockRedis.expects('constructor').returns({
exists: (sha, callback) => {
callback('error!', null);
}
});
});
it( 'It returns a database error', function() {
return LambdaTester(lambdaToTest)
.event(thingToCheck)
.expectError((err) => {
expect(err.message).to.equal('Database error');
});
});
});
我也尝试了一些变体,但我有点卡住了,因为我基本上需要模拟构造函数,我不确定诗浓是否支持这个?
mockRedis.expects('exists').returns(
(thing, callback) => {
callback('error!', null);
}
);
sinon.stub(mockRedis, 'constructor').callsFake(() => console.log('test!'));
sinon.stub(mockRedis, 'exists').callsFake(() => console.log('test!'));
不知道还能在这里尝试什么,我也尝试使用rewire 建议here,但使用mockRedis.__set__("exists", myMock); 从未设置该私有变量。
我想最终伪造我的错误路径。
我很想听听其他人正在做什么来测试节点 js 中的 redis ????.
【问题讨论】:
-
也许你可以看看ioredis的单元测试,github.com/luin/ioredis/blob/master/test/helpers/mock_server.js,ioredis是如何搭建一个假服务器的。
-
很酷,谢谢!我最终只是用 Docker 创建了一个本地 redis 服务器并将其杀死以进行错误测试,但是当我有更多时间时,我想构建一个更好的模拟。
-
但是上面的方法确实很好用,只是不想有一个 docker 依赖来运行测试
-
是的,Docker 非常适合构建测试数据库。就我而言,我通常将应用程序连接到 docker 中的 redis 集群,但我会存根所有 redis 操作。所以redis总是空的,但是省了很多力气。
标签: javascript testing redis mocha.js sinon