2017-02-19 1 views
0

Iは、(私の実際のコード実装の簡略化)の下に書かれたサンプルコードは、この簡略化されたバージョンの主なアイデアを持っている私は依存性注入さSensorクラスがどのようにユニットテストのクラスをスタブできSinonjs依存関係注入クラスをどのようにスタブするのですか?

理解することですContextクラスには、Sensorは、IOポートからデータを取得します。

センサーデータは、ComputeSensorクラスで期待値と比較され、context.reportオブジェクトに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, 
} 

それとも私がSinonはそれを行うことができると思い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

関連する問題