我试图想出一个办法来嘲笑的Redis在此模块中:惩戒Redis的构造与兴农
//module.js
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
});
}
};
// test-module.js
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');
});
});
});
我也尝试了一些变化,但我有点卡住,因为我基本上需要模拟构造函数,我不确定Sinon支持这个吗?
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);
从来没有私有变量尝试。
我想假最终我的错误路径。
我很想听听别人在做什么,以测试在redis的JS节点。
也许你可以看看ioredis的单元测试,https://github.com/luin/ioredis/blob/master/test/helpers/mock_server.js,ioredis是如何构建假服务器的。 –
很感谢!我最终创建了一个Docker的本地Redis服务器,并为我的错误测试杀死了它,但是当我有更多时间我想要构建一个更好的模拟器时。 – cameck
但上面的工作很好,只是宁可不必有码头依赖来运行测试 – cameck