Javascript Sinonjs如何存根依赖项注入类?

Javascript Sinonjs如何存根依赖项注入类?,javascript,unit-testing,mocha.js,sinon,stub,Javascript,Unit Testing,Mocha.js,Sinon,Stub,我在下面编写了示例代码(从我的实际代码实现中进行了简化),这个简化版本的主要思想是理解如何为单元测试存根类 我有一个Sensor类,它被依赖注入Context类,这个Sensor将从一些IO端口获取数据 传感器数据将在ComputeSensor类中比较预期值,并将report键插入上下文。report对象 我可以知道如何存根或模拟传感器类,以便创建一个假值来测试代码吗 class Sensor { getData() { return { heat: th

我在下面编写了示例代码(从我的实际代码实现中进行了简化),这个简化版本的主要思想是理解如何为单元测试存根类

我有一个
Sensor
类,它被依赖注入
Context
类,这个
Sensor
将从一些
IO
端口获取数据

传感器数据将在
ComputeSensor
类中比较预期值,并将
report
键插入
上下文。report
对象

我可以知道如何存根或模拟
传感器
类,以便创建一个假值来测试代码吗

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,
}
或者我可以写一个模拟类如下..但我认为西农可以做到

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

我希望我理解正确。
您可以存根这些方法,因此当有IO调用时,将返回一个固定值
e、 g.

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

});

希望这有助于澄清。

如果使用sinon.createStubInstance,如何存根该方法?