[javascript] Sinon.js로 클래스 메서드 스터 빙

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)

그냥 교체 spystubmock 필요에 따라.

assert.ok테스트 프레임 워크에있는 어설 션 으로 교체해야합니다 .


답변

팁에 대한 @loganfsmyth에게 감사드립니다. 다음과 같이 Ember 클래스 메서드에서 작업 할 스텁을 얻을 수있었습니다.

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


답변