Я использую Jasmine 2.5.2 для написания модульных тестов для кода, который выполняет запросы Ajax с использованием jQuery 3.1.1. Я хотел бы высмеять вызов Ajax, предоставляя свой собственный статус ответа и текст.Mocking jQuery ajax calls with Jasmine
Я использую плагин ajax Jasmine (https://github.com/pivotal/jasmine-ajax).
Следуя примеру на https://jasmine.github.io/2.0/ajax.html, который использует объект XMLHttpRequest, отлично работает.
describe("mocking ajax", function() {
describe("suite wide usage", function() {
beforeEach(function() {
jasmine.Ajax.install();
});
afterEach(function() {
jasmine.Ajax.uninstall();
});
it("specifying response when you need it", function() {
var doneFn = jasmine.createSpy("success");
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(args) {
if (this.readyState == this.DONE) {
doneFn(this.responseText);
}
};
xhr.open("GET", "/some/cool/url");
xhr.send();
expect(jasmine.Ajax.requests.mostRecent().url).toBe('/some/cool/url');
expect(doneFn).not.toHaveBeenCalled();
jasmine.Ajax.requests.mostRecent().respondWith({
"status": 200,
"contentType": 'text/plain',
"responseText": 'awesome response'
});
expect(doneFn).toHaveBeenCalledWith('awesome response');
});
});
});
NB: это немного отличается от документированной, например, пришлось изменить jasmine.Ajax.requests.mostRecent().response()
к jasmine.Ajax.requests.mostRecent().respondWith()
.
Когда я использую jQuery Ajax, doneFn никогда не вызывается.
describe("mocking ajax", function() {
describe("suite wide usage", function() {
beforeEach(function() {
jasmine.Ajax.install();
});
afterEach(function() {
jasmine.Ajax.uninstall();
});
it("specifying response when you need it", function() {
var doneFn = jasmine.createSpy("success");
$.ajax({
method: "GET",
url: "/some/cool/url"})
.done(function(result) {
doneFn(result);
});
expect(doneFn).toHaveBeenCalledWith('awesome response');
});
});
});
Жасмин утверждает, что
Жасмин-издевается Ajax ваш запрос на объекта XMLHttpRequest, поэтому должны быть совместимы с другими библиотек, которые делают AJAX запросы.
$ .ajax возвращает jqXHR от 1.4.x, а не XMLHttpRequest - поддерживает ли этот разрыв поддержку Jasmine Ajax?
Ваш второй подход работал для меня здесь. Подделка также может возвращать '$ .Deferred(). Reject (obj)' для проверки ошибки Ajax, где obj имеет свойство responseText с текстом ошибки. – Lozzer
@Lozzer это правильно. С отложенным вы можете либо разрешить/отклонить, исходя из вашего требования. –