2014-07-24 2 views
6

나는 node.js에서 일하고 있습니다. 내 앱은 node_redis 모듈을 통해 Redis와 상호 작용합니다. 내 응용 프로그램의 테스트를 자동화하기 위해 모카와 사인을 사용하고 있습니다. 내 응용 프로그램은 다음과 같은 :Sinon을 사용하여 자바 스크립트에서 스태 빙 Redis 상호 작용

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

내가 redisClient.get에 전화를() 스텁하고자합니다. -이를 위해 나는 또한 redis.createClient에 대한 호출을 스텁 필요() 내가 생각 ... 여기 내 테스트 코드입니다 :

... 
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"); 
... 

시험은 내가 redisClient 밖으로 스텁 어떻게 AssertionError: false == "someValue"

실패, 또는 심지어 이것이 가능한가?

답변

3

Proxyquire 또는 Rewire과 같은 것을 사용하면됩니다. 나는 예를 들어 재선을 사용할 것이다.

코드 스 니펫은 스텁 원하는 : 당신이 당신의 redisClient를 교체 할 수

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); 

이 방법 당신은 확인 할 수 있습니다

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

그런 다음 테스트에서 당신은 재배 선을 사용할 수 있습니다 함수가 호출되면 스파이.

+0

redisClient 변수가 노출되어야합니까? 또는 모듈에서 사설 변수를 다시 연결할 수 있습니까? – Scotty

+1

@Scotty 그래, 개인 변수도 다시 연결할 수 있습니다. :) – Osukaa

+0

게임 체인저! 정말 고마워! :디 – Scotty