Javascript 使用sinon的存根redis发布方法?
如何存根redis publish方法Javascript 使用sinon的存根redis发布方法?,javascript,unit-testing,sinon,stub,stubbing,Javascript,Unit Testing,Sinon,Stub,Stubbing,如何存根redis publish方法 // 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 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
?
我可以使用proxyquire
存根redis.createClient
,如果我这样做,它会抱怨发布
未定义
我当前的测试代码
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);
})
您只需在publish方法上设置spy,无需使用
proxyquire
e、 g.
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;
});
});
我找到了一种方法,只需使用
sinon
只需要使用sinon.createStubInstance
创建一个存根实例,
然后,此存根将具有sinon
中的所有功能,而无需实现对象(仅类方法名称)
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);
})