2017-02-20 12 views
0

redis 게시 방법을 스텁하는 방법은 무엇입니까? sinon을 사용하여 스터 빙 redis 게시 방법?

// module ipc 
const redis = require('redis'); 

module.exports = class IPC { 
    constructor() { 
     this.pub = redis.createClient(); 
    } 

    publish(data) { 
     this.pub.publish('hello', JSON.stringify(data)); 
    } 
} 

다른 모듈은

// module service 
module.exports = class Service { 
    constructor(ipc) { 
     this.ipc = ipc; 
    } 

    sendData() { 
     this.ipc.publish({ data: 'hello' }) 
    } 
} 

어떻게 민간 변수 IPC 클래스 pub 스텁 수 있을까? 나는 그것이 publish 정의되지 않은

나의 현재 테스트 코드

let ipcStub; 
    before(() => { 
     ipcStub = proxyquire('../ipc', { 
      redis: { 
       createClient: sinon.stub(redis, 'createClient'), 
      } 
     }) 
    }); 

    it('should return true',() => { 
     const ipc = new ipcStub(); 

     const ipcPublishSpy = sinon.spy(ipc, 'publish') 

     const service = new Service(ipc); 

     service.sendData(); 

     assert.strictEqual(true, ipcPublishSpy.calledOnce); 
    }) 

답변

0

난 그냥 sinon

그냥 오브젝트의 구현없이 sinon에서 모든 기능을해야합니다 sinon.createStubInstance, 다음이 스텁을 사용하여 스텁 인스턴스를 생성해야 사용하여 그것을 할 수있는 방법을 발견 (클래스 메서드 이름 만)

let ipcStub; 
before(() => { 
    ipcStub = sinon.createStubInstance(IPC) 
}); 

it('should return true',() => { 
    const ipc = new ipcStub(); 
    const service = new Service(ipc); 

    service.sendData(); 

    assert.strictEqual(true, ipc.publishSystem.calledOnce); 
}) 
0
당신은 단지 방법을 게시 에 스파이를 설정해야

, 필요 불평하지 않습니다 그렇게 할 경우 나는, proxyquire를 사용하여 redis.createClient에게 스텁 수 proxyquire의 경우
예 :

import {expect} from 'chai'; 
import sinon from 'sinon'; 

class IPC { 
    constructor() { 
     this.pub = { 
      publish:() => {} //here your redis requirement 
     }; 
    } 

    publish(data) { 
     this.pub.publish('hello', JSON.stringify(data)); 
    } 
} 

class Service { 
    constructor(ipc) { 
     this.ipc = ipc; 
    } 

    sendData() { 
     this.ipc.publish({ data: 'hello' }) 
    } 
} 

describe('Test Service',() => { 
    it('should call publish ',() => { 
     const ipc = new IPC; 
     sinon.spy(ipc.pub,'publish'); 
     const service = new Service(ipc); 

     service.sendData(); 

     expect(ipc.pub.publish.calledOnce).to.be.true; 
    }); 
});