【问题标题】:stubbing redis publish method using sinon?使用 sinon 存根 redis 发布方法?
【发布时间】:2017-07-09 19:37:24
【问题描述】:

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

如何在 IPC 类中存根私有变量 pub? 我可以使用proxyquire 存根redis.createClient,如果我这样做,它会抱怨publish undefined

我当前的测试代码

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

【问题讨论】:

    标签: javascript unit-testing sinon stub stubbing


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您只需要在 publish 方法上设置 spy,不需要 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;
          });
      });
      

      【讨论】:

        猜你喜欢
        • 2015-04-18
        • 2021-06-10
        • 1970-01-01
        • 2014-09-16
        • 2014-07-17
        • 2014-08-08
        • 2017-04-27
        • 2016-01-02
        • 2021-04-10
        相关资源
        最近更新 更多