2017-02-19 8 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, 
} 

아니면 내가 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