Sinon заглушает функцию, переданную в качестве параметра
У меня есть следующий пример класса:
function Example() {...}
Example.prototype.someFunc1() {...}
Example.prototype.someFunc2() {...}
Example.prototype.func(func) {var res = func(); ...}
Я обычно звоню Example#func()
следующее:
var example = new Example();
example.func(example.someFunc1)
// or like this, depending on what I want
example.func(example.someFunc2)
Теперь я заглушка Example#someFunc1()
следующим образом в моем тесте:
var example = new Example();
sinon.stub(example, 'someFunc1').returns(...);
exmaple.func(example.someFunc1);
Проблема в том, что Example#someFunc1()
не ошарашивают таким образом и вызывают как обычно. Что я могу сделать в такой ситуации?
1 ответ
В вашем примере вы сохраняете ссылку на функцию. Тогда ты заглушки.
Вы передаете ссылку на исходную функцию, а не на заглушенную функцию.
Функция, которую вы заглушаете, не исчезает, когда вы заглушаете ее - поэтому вы можете restore()
это позже. Вам либо нужно передать ссылку на саму функцию объекта, например,
sinon.stub(example, 'opt1').returns(42);
example.logic([3, 2], example.opt1);
Или передать ссылку на заглушку, например,
var fn = sinon.stub(example, 'opt1').returns(42);
example.logic([3, 2], fn);
Последнее, правда, не имеет никакого смысла в качестве теста; Вы можете просто передать любую функцию, нет никаких причин, чтобы заглушить что-либо.
FWIW, ваша скрипка далеко не эквивалентна исходному коду, который вы опубликовали.
Непонятно, что вы пытаетесь проверить: вы передаете ссылку на функцию - это может быть любая старая функция, независимо от того, прикреплена она к или нет. Example
объект, например, анонимная функция будет в порядке.
Если тестируемая функция сама называется функцией-заглушкой, заглушка имеет смысл.