Можно ли заглушить что-то, кроме функции? - PullRequest
0 голосов
/ 05 июля 2018
$.ajax({
    type: "GET",
    cache: false,
    url: serviceURL + campaignId + "/question/" + questionId + "?showDraft=" 
        + showDraft,
    contentType: "application/json; charset=utf-8",
    success: function (data) {
        if ($.isFunction(callback)) {
            callback(data);
        }
    }
});

Я пытаюсь проверить приведенный выше код, используя Mocha, Sinon и Chai. В частности, строка, где говорится «успех». Я уже проверял, передавая заглушку в качестве обратного вызова и утверждал, что он был вызван.

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

Для того, чтобы isFunction была ложной, я не могу передать заглушку. Есть идеи?

Обновление:

Я уже заглушил AJAX. Я специально смотрю на успех линии. Как я могу проверить, что когда не-функция передается в качестве обратного вызова, нет попытки вызвать ее?

1 Ответ

0 голосов
/ 05 июля 2018

Записывая обратный вызов, вы проверяете, что метод jQuery ajax работает. Но я подозреваю, что это не тестируемое устройство. Кроме того, заглушка обратного вызова не помешает сетевому вызову, чего вы, вероятно, не хотите делать в своем тесте.

Вместо этого вы должны заглушить ajax(). Затем вы можете утверждать, что он был вызван и что было передано функции - вы можете проверить, что он был вызван с объектом, содержащим свойство success, которое указывает на функцию.

Пример этого есть в документах Sinon :

after(function () {
    jQuery.ajax.restore();
});

it('makes a GET request for todo items', function () {
    sinon.replace(jQuery, 'ajax', sinon.fake());
    getTodos(42, sinon.fake());

    // here you can test what was passed to the ajax including the type of 
    // the success handler
    assert(jQuery.ajax.calledWithMatch({ url: '/todo/42/items' }));
});
...