用 Sinon.js 存根类方法

IT技术 javascript node.js sinon
2021-03-07 00:16:30

我正在尝试使用 sinon.js 存根一个方法,但出现以下错误:

Uncaught TypeError: Attempted to wrap undefined property sample_pressure as function

我也去了这个问题(在 sinon.js 中存根和/或嘲笑一个类?)并复制并粘贴了代码,但我得到了同样的错误。

这是我的代码:

Sensor = (function() {
  // A simple Sensor class

  // Constructor
  function Sensor(pressure) {
    this.pressure = pressure;
  }

  Sensor.prototype.sample_pressure = function() {
    return this.pressure;
  };

  return Sensor;

})();

// Doesn't work
var stub_sens = sinon.stub(Sensor, "sample_pressure").returns(0);

// Doesn't work
var stub_sens = sinon.stub(Sensor, "sample_pressure", function() {return 0});

// Never gets this far
console.log(stub_sens.sample_pressure());

这是上述代码的 jsFiddle ( http://jsfiddle.net/pebreo/wyg5f/5/ ),以及我提到的 SO 问题的 jsFiddle ( http://jsfiddle.net/pebreo/9mK5d/1/)。

我确保在 jsFiddle 甚至 jQuery 1.9外部资源包含 sinon 我究竟做错了什么?

4个回答

您的代码试图在 上存根函数Sensor,但您已在 上定义了该函数Sensor.prototype

sinon.stub(Sensor, "sample_pressure", function() {return 0})

本质上与此相同:

Sensor["sample_pressure"] = function() {return 0};

但它足够聪明地看到它Sensor["sample_pressure"]不存在。

所以你想要做的是这样的事情:

// Stub the prototype's function so that there is a spy on any new instance
// of Sensor that is created. Kind of overkill.
sinon.stub(Sensor.prototype, "sample_pressure").returns(0);

var sensor = new Sensor();
console.log(sensor.sample_pressure());

或者

// Stub the function on a single instance of 'Sensor'.
var sensor = new Sensor();
sinon.stub(sensor, "sample_pressure").returns(0);

console.log(sensor.sample_pressure());

或者

// Create a whole fake instance of 'Sensor' with none of the class's logic.
var sensor = sinon.createStubInstance(Sensor);
console.log(sensor.sample_pressure());
什么东西被弃用了?
2021-04-23 00:16:30
sinon.stub(传感器,“样本压力”,函数(){返回0})
2021-04-25 00:16:30
似乎没有returns被弃用。sinonjs.org/releases/v3.0.0/stubs@danday74,请提供参考。
2021-04-25 00:16:30
@ danday74.stub与函数作为第三个参数是去除:github.com/sinonjs/sinon/blob/master/lib/sinon/stub.js#L17没有什么不妥.returns或者.callsFake,所以没有错的答案。
2021-05-10 00:16:30
这是我的回答,因为最初的问题专门询问了它。鉴于我的回答并不建议将其作为开始的正确方法,我不确定您要我更改什么。.returns(0)已经做同样的事情.callFake(() => 0)
2021-05-14 00:16:30

不推荐使用最佳答案。你现在应该使用:

sinon.stub(YourClass.prototype, 'myMethod').callsFake(() => {
    return {}
})

或者对于静态方法:

sinon.stub(YourClass, 'myStaticMethod').callsFake(() => {
    return {}
})

或者对于简单的情况,只需使用返回:

sinon.stub(YourClass.prototype, 'myMethod').returns({})

sinon.stub(YourClass, 'myStaticMethod').returns({})

或者,如果您想为实例存根方法:

const yourClassInstance = new YourClass();
sinon.stub(yourClassInstance, 'myMethod').returns({})
您的解决方案对我有用。我希望如果我给你更多的分数 :D 谢谢。
2021-04-18 00:16:30
如果您能在将其添加到sinonjsie时提及您所说方法的特定版本,那就太好了callsFake(),对于旧版本,如何弃用?
2021-05-03 00:16:30
使用 ES6 module时:我在测试项目中创建 YourClass.get() 的存根。该测试调用另一个导入 YourClass 的module。module YourClass.get() 会尊重存根吗?如果没有,有没有解决办法?
2021-05-16 00:16:30

我在尝试使用 Sinon 模拟 CoffeeScript 类的方法时遇到了同样的错误。

给定一个这样的类:

class MyClass
  myMethod: ->
    # do stuff ...

您可以通过以下方式用间谍替换其方法:

mySpy = sinon.spy(MyClass.prototype, "myMethod")

# ...

assert.ok(mySpy.called)

只需更换spystubmock需要。

请注意,您需要assert.ok用测试框架具有的任何断言替换

感谢@loganfsmyth 的提示。我能够让存根在 Ember 类方法上工作,如下所示:

sinon.stub(Foo.prototype.constructor, 'find').returns([foo, foo]);
expect(Foo.find()).to.have.length(2)
看起来不像重复——这里有Foo.prototype.constructor,在原始答案中有Sensor.prototype再说一次,Foo.prototype.constructor对我不起作用。:)
2021-04-22 00:16:30
这是一条评论。以感谢另一个答案开始,以重复其代码结束。
2021-05-06 00:16:30