Проблема в том, что $()
- это функция, которая возвращает объект с методом val()
.Таким образом, вы должны заглушить $ (), чтобы вернуть объект-заглушку, имеющий метод val.
$ = sinon.stub();
$.withArgs('#category').returns(sinon.stub({val: function(){}}));
Но главная ошибка здесь - позволить коду, который вы хотите проверить, вызвать функцию $ () для создания новогоэкземпляров.Зачем?Лучше всего не создавать новые экземпляры в вашем классе, а передавать их в конструктор.Допустим, у вас есть функция, которая будет получать значение из входных данных, удваивать его и записывать обратно в другое:
function doubleIt(){
$('#el2').val(('#el1').val() *2);
}
В этом случае вы создаете 2 новых объекта, вызывая $()
.Теперь вам нужно заглушить $()
, чтобы вернуть макет и заглушку.Используя следующий пример, вы можете избежать этого:
function doubleIt(el1, el2){
el2.val(el1.val() *2);
}
Хотя в первом случае вы должны заглушить $, чтобы вернуть заглушку, во втором случае вы можете легко передать заглушку и шпиона в вашу функцию..
Итак, тест sinon для второго будет выглядеть так:
var el1 = sinon.stub({val: function(){}});
el1.returns(2);
var el2 = sinon.spy({val: function(){}}, 'val')
doubleIt(el1, el2)
assert(el2.withArgs(4).calledOnce)
Итак, поскольку у вас нет элементов dom, вы можете просто протестировать логику приложения без необходимостисоздайте тот же дом, что и в вашем приложении.