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을 포함했는지 확인했습니다 . 내가 뭘 잘못하고 있죠?
답변
코드에서에서 함수를 스텁하려고 시도 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());
답변
상위 답변은 더 이상 사용되지 않습니다. 이제 다음을 사용해야합니다.
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({})
답변
Sinon을 사용하여 CoffeeScript 클래스의 메서드를 모의하려고 시도하는 것과 동일한 오류가 발생했습니다.
다음과 같은 클래스가 주어집니다.
class MyClass
myMethod: ->
# do stuff ...
다음과 같이 방법을 스파이로 바꿀 수 있습니다.
mySpy = sinon.spy(MyClass.prototype, "myMethod")
# ...
assert.ok(mySpy.called)
그냥 교체 spy
와 stub
나mock
필요에 따라.
assert.ok
테스트 프레임 워크에있는 어설 션 으로 교체해야합니다 .
답변
팁에 대한 @loganfsmyth에게 감사드립니다. 다음과 같이 Ember 클래스 메서드에서 작업 할 스텁을 얻을 수있었습니다.
sinon.stub(Foo.prototype.constructor, 'find').returns([foo, foo]);
expect(Foo.find()).to.have.length(2)
답변
