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 объект, например, анонимная функция будет в порядке.

Если тестируемая функция сама называется функцией-заглушкой, заглушка имеет смысл.

Другие вопросы по тегам