我正在使用 Jasmine 2.5.2 为使用 jQuery 3.1.1 执行 Ajax 请求的代码编写单元测试。我想模拟 Ajax 调用,提供我自己的响应状态和文本。
我正在使用 Jasmine ajax 插件(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');
});
});
});
注意:这与记录的示例略有不同,必须更改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');
});
});
});
茉莉花说
Jasmine-Ajax 在 XMLHttpRequest 对象上模拟您的请求,因此应该与执行 ajax 请求的其他库兼容。
$.ajax 从 1.4.x 返回 jqXHR 而不是 XMLHttpRequest - 这会破坏 Jasmine Ajax 的支持吗?