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,如何存根该方法?