2017-05-31 71 views
0

我试图想出一个办法来嘲笑的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节点。

+0

也许你可以看看ioredis的单元测试,https://github.com/luin/ioredis/blob/master/test/helpers/mock_server.js,ioredis是如何构建假服务器的。 –

+0

很感谢!我最终创建了一个Docker的本地Redis服务器,并为我的错误测试杀死了它,但是当我有更多时间我想要构建一个更好的模拟器时。 – cameck

+0

但上面的工作很好,只是宁可不必有码头依赖来运行测试 – cameck

回答

0

您的问题不在于Sinon是否支持这个或那个,而是对Ecmascript中“类”的工作方式缺乏了解,正如试图在测试代码中剔除constructor属性所示。这将永远不会起作用,因为该财产与如何产生任何结果对象无关。它只是对用于创建对象的函数的引用。我已经涵盖a very similar topic on the Sinon tracker,你可能有兴趣在阅读中获得一些核心JS富:-)基本上,这是不可能的存根构造函数,但你也许可以强迫你的代码通过DI或使用另一个构造函数在其位置链接接缝。

由于事实上,有几个答案倒在同一个线程,你会看到我涵盖我自己如何设计一个Redis的使用类是通过支持依赖注入容易测试的例子。您可能需要to check it out,因为它或多或少直接适用于上面的示例模块。

另一项技术,您已经尝试开始工作,正在使用连接接缝(使用rewire)。 Sinon主页有这样做的nice article。无论rewireproxyquire将在这里做的工作就好了:我觉得你刚才用一个模拟的包裹需要声明的事情有点复杂。

即使我对兴农维护团队,我从来没有使用mock功能,所以我不能告诉你如何使用,因为我认为这掩盖了测试,但要获得基本环节接缝使用rewire我的工作基本上会先删除所有的Sinon代码,然后获取基本情况(删除redis以创建已创建的残留模块)。

只有这样,根据需要添加兴农代码。

+0

这是非常有用的,谢谢!今天学到了一些新的东西:D – cameck

+0

甜,如果有人能帮忙,总是很好。如果你应该继续这样做,并坚持下去,请回来。如有需要可以更新一些细节。 – oligofren