使用Sinon在javascript中扼杀Redis交互

我在node.js工作。 我的应用程序通过node_redis模块与Redis进行交互。 我正在使用摩卡和sinon来自动testing我的应用程序。 我的应用程序看起来像这样:

 ...snip var redisClient = redis.createClient(redisPort, redisHost); var someValue = redisClient.get("someKey"); return someValue; .... 

我想将呼叫存根到redisClient.get()。 要做到这一点,我也需要存根调用redis.createClient() – 我认为…这是我的testing代码:

 ... var redis = require("redis"); var redisClient; ... sinon.stub(redisClient, 'get').returns("someValue"); sinon.stub(redis, "createClient").returns(redisClient); ... assert.equal(redis_client_underTest.call_to_redis(), "someValue"); ... 

testing失败与AssertionError: false == "someValue"

我如何将redisClient存根,或者甚至可能呢?

你可以做的是使用像Proxyquire或Rewire的东西。 我将使用rewire作为例子。

您想要存根的代码片段:

 var redisClient = redis.createClient(redisPort, redisHost); var someValue = redisClient.get("someKey"); return someValue; 

然后在你的testing中,你可以使用rewire:

 var Rewire = require('rewire'); var myModule = Rewire("../your/module/to/test.js"); var redisMock = { get: sinon.spy(function(something){ return "someValue"; }); }; myModule.__set__('redisClient', redisMock); 

这样你可以更换你的redisClient,你可以与间谍一起检查函数是否被调用。