Javascript 用Sinon模拟Redis构造函数
我试图找出一种在本模块中模拟redis的方法:Javascript 用Sinon模拟Redis构造函数,javascript,testing,redis,mocha.js,sinon,Javascript,Testing,Redis,Mocha.js,Sinon,我试图找出一种在本模块中模拟redis的方法: const Redis = require('ioredis'); const myFunction = { exists: (thingToCheck) { let redis_client = new Redis( 6379, process.env.REDIS_URL, { connectTimeout: 75, dropBuff
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');
});
});
});
我也尝试了一些变化,但我有点卡住了,因为我基本上需要模拟构造函数,我不确定Sinon是否支持这个
mockRedis.expects('exists')。返回(
(事物,回调)=>{
回调('error!',null);
}
);
sinon.stub(mockRedis,'constructor').callsFake(()=>console.log('test!'));
sinon.stub(mockRedis,'exists').callsFake(()=>console.log('test!'));
不确定这里还有什么可以尝试的,我也按照建议尝试了使用,但使用了mockRedis.\uuuuu set\uuuuuuuu(“存在”,myMock)代码>从不设置该私有变量
我想最终伪造我的错误路径。
我很想听听其他人如何在node js中测试redis您的问题不在于Sinon是否支持这个或那个,而在于缺少对Ecmascript中“类”如何工作的理解,如在测试代码中存根构造函数
属性的尝试所示。这永远不会起作用,因为该属性与任何结果对象的结果无关。它只是对用于创建对象的函数的引用。我已经介绍过,您可能有兴趣阅读一些核心JS foo:-)基本上,不可能存根一个构造函数,但您可能会通过DI或链接接缝强制代码使用另一个构造函数
事实上,在同一个线程中有几个答案,您将看到我介绍了一个示例,说明我自己是如何使用类设计Redis的,该类通过支持依赖项注入而易于测试。您可能需要,因为它或多或少直接适用于上面的示例模块
另一种你已经尝试过的技术是使用链接接缝(使用重新布线
)。Sinon主页对此有详细说明。rewre
和proxyquire
在这里都能很好地完成工作:我认为您刚刚用模拟代码包装了require语句,使问题变得有点复杂
尽管我是Sinon维护团队的成员,但我从未使用过mock
功能,因此我无法告诉您如何使用该功能,因为我认为这会妨碍测试,但要使用rewire
使基本链接接缝正常工作,我基本上会先删除所有Sinon代码,然后开始基本案例(删除您创建的存根模块的redis
)
只有这样,才能根据需要添加Sinon代码。也许你可以看看ioredis的单元测试,这是ioredis如何构建一个假的服务器。很酷,谢谢!我最终只是用Docker创建了一个本地redis服务器,并杀死它进行错误测试,但当我有更多的时间时,我想构建一个更好的模拟。但是上面的方法确实很有效,只是会让我失望她不必依赖docker来运行testsYes,docker非常适合构建测试数据库。在我的例子中,我通常将应用程序连接到docker中的redis群集,但我会存根所有redis操作。因此redis总是空的,但它节省了很多工作。这非常有用,谢谢!今天学到了一些新东西:DSweet,alway如果有人能帮上忙,那太好了。如果你继续这样做并陷入困境,请回复。如果需要,可能会更新一些详细信息。