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


99

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을 포함했는지 확인했습니다 . 내가 뭘 잘못하고 있죠?

답변:


155

코드에서에서 함수를 스텁하려고 시도 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());

1
어떤 것이 더 이상 사용되지 않습니까?
loganfsmyth

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

원래 질문이 구체적으로 질문했기 때문에 내 대답입니다. 내 대답이 올바른 접근 방식으로 제안하지 않는다는 점을 감안할 때 무엇을 변경하라고 요청 하시는지 잘 모르겠습니다. .returns(0)이미 .callFake(() => 0).
loganfsmyth

1
returns더 이상 사용 되지 않는 것 같습니다 . sinonjs.org/releases/v3.0.0/stubs . @ danday74, 참조를 제공하십시오.
allenhwkim

2
.stub세 번째 인수로 함수가있는 @ danday74 가 제거됩니다. github.com/sinonjs/sinon/blob/master/lib/sinon/stub.js#L17.returns or에 문제가 없습니다..callsFake , 그래서이 답변에 아무것도 잘못이있다.
loganfsmyth

52

상위 답변은 더 이상 사용되지 않습니다. 이제 다음을 사용해야합니다.

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({})

4
이것이 추가되었을 때 언급 한 방법에 대한 특정 버전을 언급 할 수 있다면 좋을 것입니다. sinonjscallsFake()를 들어, 이전 버전의 경우 어떻게이 방법이 더 이상 사용되지 않을 수 있습니까?
aitchkhan

3
ES6 모듈을 사용할 때 : 테스트 프로젝트에서 YourClass.get ()의 스텁을 만듭니다. 이 테스트는 YourClass를 가져 오는 다른 모듈을 호출합니다. YourClass.get () 모듈이 스텁을 존중합니까? 그렇지 않다면 해결책이 있습니까?
학습자

1
귀하의 솔루션이 저에게 효과적입니다. 더 많은 포인트를 주면 좋겠다 : D 감사합니다.
Rubel hasan

5

Sinon을 사용하여 CoffeeScript 클래스의 메서드를 모의하려고 시도하는 것과 동일한 오류가 발생했습니다.

다음과 같은 클래스가 주어집니다.

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

다음과 같이 방법을 스파이로 바꿀 수 있습니다.

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

# ...

assert.ok(mySpy.called)

그냥 교체 spystubmock 필요에 따라.

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


2

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

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

3
댓글입니다. 다른 답변 덕분에 시작하고 코드 중복으로 끝납니다.
michelpm

5
중복처럼 보이지 않습니다. 여기 Foo.prototype.constructor에 원래 답변과 같이 Sensor.prototype있습니다. 그런 다음 다시 Foo.prototype.constructor작동하지 않습니다. :)
shaunc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.