2016-08-20 6 views
1

У меня есть следующий пример класса: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() не bein g пробиты таким образом и называются нормально. Что я могу сделать в такой ситуации?

+0

Я не могу воспроизвести это; https://gist.github.com/davelnewton/a2b786fd485b6767606bcb20942c4616 –

+0

@DaveNewton Я сделал скрипку: https://jsfiddle.net/f7p7z5fL/ – Jorayen

ответ

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

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

+0

Да, я не знал, о чем думал, я просто хотел выполнить единичный тест #logic() и изолировать его, поэтому я его обрезал, я должен был просто пройти любой заглушку, как вы сказали .. спасибо :) – Jorayen