2017-02-20 74 views
0

如何存根redis发布方法?使用sinon的stubbing 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' }) 
    } 
} 

我怎么能存根私有变量pubIPC类? 我可以存根redis.createClient使用proxyquire,如果我这样做,它会抱怨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
例如

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