我很难找到关于如何使用Jasmine BDD伪造ajax调用的任何示例?
我有一个自定义的ajax函数,就像这样......
ajax({
url: 'JSON.php',
dataType: 'json',
onSuccess: function(resp) {
console.log(resp);
}
});
...而且我不知道如何创建一个存根来伪造调用实际的ajax函数。
我想避免调用ajax函数,因为如果对服务器的真正的ajax调用需要一些时间来响应并且我的测试套件中有大量的规范,它可能会减慢我的测试套件。
我听说你可以使用spyOn(namespace, 'ajax')
,但这很烦人,因为它要求我将ajax
函数包装在一个对象中,只是为了使用spyOn
函数(但是无论我无法跟进,因为我找不到任何特定的例子来假冒ajax电话。)
我也听说你可以使用createSpy()
但是文档不是很有帮助(GitHub上没有相应的wiki)。
任何帮助解释如何使用间谍来创建虚假的ajax调用都将非常感激!
答案 0 :(得分:4)
您可以使用SinonJS模拟框架,它具有fake server版本。您可以轻松地将它与茉莉花一起使用:
beforeEach(function() {
server = sinon.fakeServer.create();
server.respondWith([200, { "Content-Type": "text/html", "Content-Length": 2 }, "OK"])
});
顺便说一下。如果你的ajax函数在全局命名空间中,为什么不调用spyOn(window, 'ajax')
答案 1 :(得分:0)
关于单个函数,您可以使用'createSpy':
/*var */ajax = createSpy('foo');
var
缺席,因为您想要重新定义它,但是需要您定义此间谍的块绑定到定义了真ajax
的相同范围。或者,如果您对此感到困惑,请使用spyOn(window, foo)
,因为您无论如何都要在浏览器中对其进行测试。
有关详细信息,请参阅this answer。
关于ajax调用,请参阅Asynchronous Support section中的new docs,或者更好地使用Clock:
window.ajax = function() {};
var response;
var ajaxSpy = spyOn(window, 'ajax').andCallFake(function(url, callback) {
setTimeout(function() { callback({ 'foo': 'bar' }); }, 1000);
});
jasmine.Clock.useMock();
function callback(resp) { response = resp; }
ajax('fake.url', callback);
jasmine.Clock.tick(1500);
expect(ajaxSpy).toHaveBeenCalled();
expect(response).toBeDefined();
expect(response.foo).toBeDefined();