Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用Sinon模拟Redis构造函数_Javascript_Testing_Redis_Mocha.js_Sinon - Fatal编程技术网

Javascript 用Sinon模拟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

我试图找出一种在本模块中模拟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');
              });
      });
});
我也尝试了一些变化,但我有点卡住了,因为我基本上需要模拟构造函数,我不确定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如果有人能帮上忙,那太好了。如果你继续这样做并陷入困境,请回复。如果需要,可能会更新一些详细信息。