使用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,你可以与间谍一起检查函数是否被调用。