복붙노트

[REDIS] 자바 스크립트 스텁 레디 스가 상호 작용 Sinon를 사용하여

REDIS

자바 스크립트 스텁 레디 스가 상호 작용 Sinon를 사용하여

나는 node.js.하고 있어요 node_redis 모듈을 통해 레디 스에 내 응용 프로그램의 상호 작용. 나는 내 응용 프로그램의 테스트를 자동화하는 모카와 sinon을 사용하고 있습니다. 내 응용 프로그램은 다음과 같은 :

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

시험은 AssertionError를 실패 : FALSE == "someValue와"

어떻게 redisClient을 스텁 또는 본도 가능합니까?

해결법

  1. ==============================

    1.당신이 할 수있는 것은 Proxyquire 또는 재배 선 같이 사용 무언가이다. 나는 예를 들어 재배 선을 사용하여 수 있습니다.

    당신이 할 수있는 것은 Proxyquire 또는 재배 선 같이 사용 무언가이다. 나는 예를 들어 재배 선을 사용하여 수 있습니다.

    코드 스 니펫은 스텁 원하는 :

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

    그런 다음 테스트에서 당신은 재배 선을 사용할 수 있습니다 :

    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을 가질 수 있습니다이 방법은 대체 함수가 호출 된 경우에는 스파이로 확인할 수 있습니다.

  2. ==============================

    2.또한 node_redis 교체의 하락은 레디 스 - 모의 같은 것을 사용할 수있는 메모리에서 실행.

    또한 node_redis 교체의 하락은 레디 스 - 모의 같은 것을 사용할 수있는 메모리에서 실행.

    사용의 재배 선 (또는 농담 모듈 모의 객체 또는 무엇이든)는 실제 클라이언트 대신 테스트에서 모의 ​​클라이언트를로드하고 메모리 버전에 대한 모든 테스트를 실행합니다.

  3. ==============================

    3.다른 방법은 클래스의 정적 기능 getRedis에서 수행하고 조롱하는 것입니다. 예를 들면 :

    다른 방법은 클래스의 정적 기능 getRedis에서 수행하고 조롱하는 것입니다. 예를 들면 :

    let redis = {
       createClient: function() {},
    };
    let connection = {
       saddAsync: function() {},
       spopAsync: function() {},
    };
    let saddStub = sinon.stub(connection, 'saddAsync');
    sinon.stub(redis, 'createClient').returns(connection);
    sinon.stub(Redis, 'getRedis').returns(redis);
    
    expect(saddStub).to.be.calledOnce;
    

    클래스 내부 연결 기능은 다음과 같습니다

    this.connection = YourClass.getRedis().createClient(port, host, optional);
    
  4. ==============================

    4.이것은 처음에 나에게 매우 사소한 듯하지만 난 proxyquire를 지원하지 않는 테스트를 위해 농담 사용되었다 특히 때문에주의를 많이 직면했다. 내 목표는 내가 그것을 달성하는 방법 그래서 여기, 레디 스의 요청 의존성을 조롱했다 :

    이것은 처음에 나에게 매우 사소한 듯하지만 난 proxyquire를 지원하지 않는 테스트를 위해 농담 사용되었다 특히 때문에주의를 많이 직면했다. 내 목표는 내가 그것을 달성하는 방법 그래서 여기, 레디 스의 요청 의존성을 조롱했다 :

    // The objective is to mock this dependency
    const redis = require('redis');
    
    const redisClient = redis.createClient();
    redis.set('key','value');
    

    rewiremock와 의존성을 조롱 :

    const rewiremock = require('rewiremock/node');
    
    const app = rewiremock.proxy('./app', {
      redis: {
        createClient() { 
          console.log('mocking createClient');
        },
        set() {
          console.log('mocking set');
        }
      },
    });
    

    캐치는 당신이 의존성을 모의 rewiremock 같은 라이브러리를 필요, 농담과 재배 선, 또는 proxyquire를 사용할 수 있다는 것입니다.

    REPL 예

  5. from https://stackoverflow.com/questions/24937212/stubbing-redis-interactions-in-javascript-using-sinon by cc-by-sa and MIT license