2017-01-16 6 views
1

Я приношу тесты в наши файлы javascript на моем месте работы. Я решил использовать библиотеки Mocha, Chai и Sinon, чтобы помочь в тестировании. Я начинаю писать блок-тесты для функций, которые не требуют слишком много рефакторинга, и столкнулись с этим интересным случаем, который я действительно не понимаю.Sinon заглушка функция в пределах функции

function getQueries() { 
    code that returns queries in an array -> ['one', 'two', 'three']  
} 

function sort(col, type) { 
    var queries = getQueries(); 
    some code that sorts these queries 
    return sorted array 
} 

Поскольку я модульное тестирование функции сортировки я хотел незавершенную getQueries() для возврата фиктивного списка.

var queries = ['one', 'two', 'three']; 
sinon.stub(getQueries).returns(queries); 

Приведенный выше код не работает Сообщ ошибки:

TypeError: Attempted to wrap undefined property undefined as function 
at Object.wrapMethod (file://node_modules/sinon/pkg/sinon-1.17.7.js:1359:29) 
at Object.stub (file://node_modules/sinon/pkg/sinon-1.17.7.js:3459:26) 
at F.stub (file://node_modules/sinon/pkg/sinon-1.17.7.js:4200:44) 
at Context.obj.stub (file://node_modules/sinon/pkg/sinon-1.17.7.js:4215:37) 
at Context.<anonymous> (unit_tests/unit_test.js:154:10) 
at Context.sinonSandboxedTest (file:/node_modules/sinon/pkg/sinon-1.17.7.js:6069:39) 

Однако код ниже сделал работу должным образом.

var queries = ['one', 'two', 'three']; 
getQueries = sinon.stub(); 
getQueries.returns(queries); 

Я не совсем понимаю, почему этот код работает, а тот, который над ним нет. Я знаю синтаксис sinon.stub (obj, method, function), но getQueries - это функция без объекта. Любое понимание очень ценится.

ответ

1

Если getQueries не является частью объекта, он является частью глобального объекта window, поэтому sinon.stub(window, 'getQueries', ...) должен сделать трюк.

Возможно, лучший подход в этом случае состоял бы в том, чтобы передать результат getQueries в функцию сортировки. В вашей текущей структуре функция sort имеет два задания: получение списка и его сортировка. Вы могли бы уйти от названия функции getSortedQueries, но фактический separation of concerns еще лучше, и вам даже не понадобилось бы издеваться или заглушить функцию, потому что вы можете просто передать фиксированный список функции сортировки.

+0

Удивительный! Я пытался использовать документ в качестве моего глобального объекта, но я думаю, его окно. Спасибо за ответ. –