【问题标题】:Sinonjs how to stub dependency injection class?Sinonjs如何存根依赖注入类?
【发布时间】:2017-07-08 11:17:42
【问题描述】:

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

我有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,
}

或者我可以写一个模拟类如下..但我认为诗乃可以做到这一点..

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

【问题讨论】:

    标签: javascript unit-testing mocha.js sinon stub


    【解决方案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();
        });
    
    });
    

    希望这有助于澄清。

    【讨论】:

    • 如果使用 sinon.createStubInstance,我如何存根方法?
    猜你喜欢
    • 1970-01-01
    • 2013-01-30
    • 2021-03-15
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多