2017-02-20 4 views
0

Wie kann ich die Redis-Publish-Methode stub?Stubbing Redis veröffentlichen Methode mit Sinon?

// module ipc 
const redis = require('redis'); 

module.exports = class IPC { 
    constructor() { 
     this.pub = redis.createClient(); 
    } 

    publish(data) { 
     this.pub.publish('hello', JSON.stringify(data)); 
    } 
} 

und ein weiteres Modul

// module service 
module.exports = class Service { 
    constructor(ipc) { 
     this.ipc = ipc; 
    } 

    sendData() { 
     this.ipc.publish({ data: 'hello' }) 
    } 
} 

Wie konnte ich die private Variable pub in IPC Klasse Stummel? Ich konnte die redis.createClient unter Verwendung proxyquire Stummel, wenn ich, dass es publish undefined

Mein aktueller Testcode

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

Antwort

0

fand ich einen Weg, es zu tun, nur durch den Einsatz sinon

Nur müssen eine Stub-Instanz mit sinon.createStubInstance, erstellen dann diese Stummel die Funktionalitäten alle von sinon des Objekts ohne die Umsetzung wird (nur der Name der Klassenmethode)

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

Sie müssen nur gesetzt den Spion auf der Methode veröffentlichen, keine Notwendigkeit beschweren für die proxyquire.
z.B.

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