Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用sinon的存根redis发布方法?_Javascript_Unit Testing_Sinon_Stub_Stubbing - Fatal编程技术网

Javascript 使用sinon的存根redis发布方法?

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

如何存根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 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);
})