使用sinon存根redis发布方法?

时间:2017-02-20 13:36:01

标签: javascript unit-testing sinon stub 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' })
    }
}

如何在pub类中存根私有变量IPC? 我可以使用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);
    })

2 个答案:

答案 0 :(得分:0)

您只需要在发布方法上设置间谍,不需要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; }); });
例如

cost

答案 1 :(得分:0)

我找到了一种方法,只需使用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);
})