2017-02-19 42 views
0

我的示例代碼寫在下面(從我的實際代碼實現簡化),這個簡化版的主要思想,就是要明白,我怎麼能存根類的單元測試Sinonjs如何對依賴注入類進行存根?

我有Sensor類,這是依賴注入到Context類,這個Sensor將從一些IO端口獲得數據。

傳感器數據將在ComputeSensor類別上進行比較以獲得預期值,並且會將report鍵值插入到context.report對象中。

我可以知道我該如何殘留或模擬Sensor類,所以我可以創建一個假的值來測試代碼?

class Sensor { 
    getData() {   
    return { 
     heat: this.getHeatSensor(), // get data from some IO 
     speed: this.getSpeedSensor() // get data from some IO 
    } 
    } 
} 

class Context { 
    constructor(sensor) { 
    this.report = {}; 
    this.sensor = sensor; 
    this.computeSensor = new ComputeSensor(); 
    } 

    execute() { 
    this.computeSensor.compute(this, this.sensor.getData()); 
    } 
} 

class ComputeSensor { 
    compute(context, sensorData) { 
    if (sensorData.heat === 123 
     && sensorData.speed === 321) 
    { 
     context.report = { 
     sensor: 'ok' 
     } 
    } 
    } 
} 

const sensor = new Sensor(); 
const context = new Context(sensor); 
context.execute(); 
console.log(context.report) // { sensor: 'ok } 

也許想要的存根代碼會是這樣嗎?

const stubSensor = sinon.createStubInstance(Sensor); 
// Inject the stub return value here? 
stubSensor.getData() = { 
    heat: 123, 
    speed: 321, 
} 

或者,我可以寫一個模擬類作爲below..But我覺得興農能做到這一點..

class MockSensor { 
     getData() { 
      return { 
        heat: 123, 
        speed: 321 
      } 
     } 
} 

回答

1

我希望我理解正確。
您可以對方法進行存根,因此當有IO調用時,將返回一個固定值。
例如

import {expect} from 'chai'; 
import sinon from 'sinon'; 

class Sensor { 
    getHeatSensor(){ 

    } 
    getSpeedSensor(){ 

    } 
    getData() { 
     return { 
      heat: this.getHeatSensor(), // get data from some IO 
      speed: this.getSpeedSensor() // get data from some IO 
     } 
    } 
} 

class Context { 
    constructor(sensor) { 
     this.report = {}; 
     this.sensor = sensor; 
     this.computeSensor = new ComputeSensor(); 
    } 

    execute() { 
     this.computeSensor.compute(this, this.sensor.getData()); 
    } 
} 

class ComputeSensor { 
    compute(context, sensorData) { 
     if (sensorData.heat === 123 && sensorData.speed === 321) { 
      context.report = { 
       sensor: 'ok' 
      } 
     } 
    } 
} 

describe('Test Sensor',() => { 
    it('should compute value ',() => { 
     const sensor = new Sensor; 
     sinon.stub(sensor,'getHeatSensor').returns(123); 
     sinon.stub(sensor,'getSpeedSensor').returns(321); 

     const context = new Context(sensor); 
     context.execute(); 

     console.log(context.report); 

     expect(context.report).to.deep.equal({sensor:'ok'}) 
     sensor.getHeatSensor.restore(); //don't forget to restore 
     sensor.getSpeedSensor.restore(); 
    }); 

    it('should return empty object ',() => { 
     const sensor = new Sensor; 
     sinon.stub(sensor,'getHeatSensor').returns(99); 
     sinon.stub(sensor,'getSpeedSensor').returns(84); 

     const context = new Context(sensor); 
     context.execute(); 

     console.log(context.report); 

     expect(context.report).to.deep.equal({}) 
     sensor.getHeatSensor.restore(); 
     sensor.getSpeedSensor.restore(); 
    }); 

}); 

希望這個幫助,澄清。

+0

如何使用sinon.createStubInstance存根方法? – Tim