Stubbing метод класса с Sinon.js

Я пытаюсь заглушить метод, используя sinon.js, но я получаю следующую ошибку:

Uncaught TypeError: Attempted to wrap undefined property sample_pressure as function

Я также пошел на этот вопрос (Stubbing и/или высмеивал класс в 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/) и jsFiddle для вопроса SO, о котором я упоминал (http://jsfiddle.net/pebreo/9mK5d/1/).

Я включил синус в Внешние ресурсы в jsFiddle и даже jQuery 1.9. Что я делаю неправильно?

Ответ 1

Ваш код пытается заблокировать функцию на Sensor, но вы определили функцию на Sensor.prototype.

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

по существу совпадает с этим:

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

но он достаточно умен, чтобы увидеть, что Sensor["sample_pressure"] не существует.

Итак, что вы хотите сделать, это что-то вроде этого:

// Stub the prototype 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 logic.
var sensor = sinon.createStubInstance(Sensor);
console.log(sensor.sample_pressure());

Ответ 2

Верхний ответ устарел. Теперь вы должны использовать:

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

Или, если вы хотите заглушить метод для экземпляра:

const yourClassInstance = new YourClass();
sinon.stub(yourClassInstance, 'myMethod').returns({})

Ответ 3

Я столкнулся с той же ошибкой, пытающейся издеваться над методом класса CoffeeScript с помощью Sinon.

Для класса, подобного этому:

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

Вы можете заменить его метод шпионом следующим образом:

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

# ...

assert.ok(mySpy.called)

Просто замените spy на stub или mock по мере необходимости.

Обратите внимание, что вам нужно заменить assert.ok на любое утверждение, имеющееся в вашей инфраструктуре тестирования.

Ответ 4

Благодаря @loganfsmyth для подсказки. Я смог заставить заглушку работать над методом класса Ember следующим образом:

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

Ответ 5

тестовый ответ. извините тестовый ответ. извините тестовый ответ. извините тестовый ответ. извините тестовый ответ. извиняюсь. import code