Что ж, возможно, пример в вопросе не тот, который вы используете локально, но он должен завершиться ошибкой в строке spyOn($, "ajax").and.callFake(deferred)
, потому что callFake
ожидает функцию, а deferred
- нет.Вместо этого deferred
должно быть с разрешением Promise и использовать .and.returnValue
вместо .and.callFake
.
Вот рабочий пример:
function itWorked() {
console.log("It worked!!");
}
function sendRequest(callbacks, configuration) {
$.ajax({}).done(function(response) {
itWorked();
});
}
describe("Ajax Tests", () => {
beforeEach(function() {
spyOn(window, "itWorked").and.callThrough();
deferred = $.Deferred().resolve(); // Call resolve
spyOn($, "ajax").and.returnValue(deferred); // Use return value
sendRequest();
});
it("should work", function() {
expect($.ajax).toHaveBeenCalled(); // pass
expect(window.itWorked).toHaveBeenCalled(); // pass
});
});
Обратите внимание, что я добавил console.log("It worked!!");
и использую .and.callThrough();
только для двойной проверки в консоли, что "Это сработало!! " было зарегистрировано.
При вызове $. Deferred (). Resol () вы можете передать насмешливый ответ, который нужно обработать в вашем .done
или .then
обратный вызов.Что-то вроде .resolve({ success: true })
. Посмотрите пример здесь
Надеюсь, это поможет