2017-02-20 8 views
0

Как я могу заглушить метод публикации redis?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); 
    }) 

ответ

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); 
}) 
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; 
    }); 
}); 
Смежные вопросы