用Sinon.js保存一个类的方法

我正在尝试使用sinon.js存根方法,但是我得到以下错误:

Uncaught TypeError: Attempted to wrap undefined property sample_pressure as function

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

这是我的代码:

 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.net/pebreo/wyg5f/5/,以及我提到的SO问题的jsFiddle( http://jsfiddle.net/pebreo/9mK5d/1/ )。

我确定将sinon包含在jsFiddle的外部资源中,甚至包括jQuery 1.9中。 我究竟做错了什么?

您的代码正尝试在Sensor上存根function,但是您已经在Sensor.prototype上定义了该function。

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

顶部的答案已被弃用。 你现在应该使用:

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

或者对于静态方法:

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

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

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

感谢@loganfsmyth提示。 我能够得到的存根工作在这样的Ember类的方法:

 sinon.stub(Foo.prototype.constructor, 'find').returns([foo, foo]); expect(Foo.find()).to.have.length(2) 

我遇到了同样的错误,试图模拟一个使用Sinon的CoffeeScript类的方法。

给定一个像这样的类:

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

你可以用这种方式用间谍replace它的方法:

 mySpy = sinon.spy(MyClass.prototype, "myMethod") # ... assert.ok(mySpy.called) 

只要根据需要更换spymock

请注意,您需要将assert.okreplace为您的testing框架所具有的任何声明。