2017-02-19 7 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 я думаю Sinon мог бы сделать это ..

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

Смежные вопросы