2017-02-20 73 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; 
    }); 
});