如何使用Jasmine BDD为ajax函数创建存根
我很难找到任何关于如何使用Jasmine BDD伪造ajax调用的示例 我有一个自定义的ajax函数,它的工作原理如下如何使用Jasmine BDD为ajax函数创建存根,ajax,unit-testing,bdd,jasmine,Ajax,Unit Testing,Bdd,Jasmine,我很难找到任何关于如何使用Jasmine BDD伪造ajax调用的示例 我有一个自定义的ajax函数,它的工作原理如下 ajax({ url: 'JSON.php', dataType: 'json', onSuccess: function(resp) { console.log(resp); } }); …我不知道如何创建存根来假装调用实际的ajax函数 我希望避免调用ajax函数,因为如果对服务器的真正ajax调用需要
ajax({
url: 'JSON.php',
dataType: 'json',
onSuccess: function(resp) {
console.log(resp);
}
});
…我不知道如何创建存根来假装调用实际的ajax函数
我希望避免调用ajax函数,因为如果对服务器的真正ajax调用需要一些时间才能响应,并且我的测试套件中有大量的规范,那么它可能会降低我的测试套件的速度
我听说您可以使用spyOn(名称空间,'ajax')
,但这很烦人,因为它需要我将ajax
函数包装到一个对象中,只为了使用spyOn
函数(但不管怎样,我无法跟上,因为我找不到任何具体的例子来伪造ajax调用)
我还听说您可以使用createSpy()
,但是文档也没有太大帮助(GitHub上相应的wiki也没有)
任何解释如何使用spies创建虚假ajax调用的帮助都将不胜感激 您可以使用SinonJS mocking框架,该框架具有内置功能。您可以轻松地将其与茉莉花一起使用:
beforeEach(function() {
server = sinon.fakeServer.create();
server.respondWith([200, { "Content-Type": "text/html", "Content-Length": 2 }, "OK"])
});
顺便说一句,如果您的ajax函数位于全局名称空间中,为什么不调用spyOn(窗口“ajax”)关于单个函数,您可以使用“createSpy”:
/*var */ajax = createSpy('foo');
var
不存在,因为您想重新定义它,但是需要将定义此间谍的块绑定到定义realajax
的相同范围。或者,如果您对此感到困惑,请使用spyOn(window,foo),因为您正在浏览器中测试它
有关详细信息,请参阅
关于ajax调用,请参见中的或更好地使用:
如果你不介意使用间谍,而是使用附加组件。要模拟单个规范,请使用
with mock
:
it("allows use in a single spec", function() {
var onSuccess = jasmine.createSpy('success');
jasmine.Ajax.withMock(function() {
ajax({
url: 'JSON.php',
dataType: 'json',
onSuccess: onSuccess
});
expect(onSuccess).not.toHaveBeenCalled();
jasmine.Ajax.requests.mostRecent().respondWith({
"status": 200,
"responseText": '{"some": "json"}'
});
expect(onSuccess).toHaveBeenCalledWith('{"some": "json"}');
});
});
只有在使用
respondWith
时,才会发送响应。上面的链接提供了一些如何安装的说明谢谢,我昨天就已经开始自己做了。请参阅要点:需要注意的一件重要事情是,Clock
mock实际上取代了setTimeout
/setInterval
调用,因此它们将立即被调用,但以指定的顺序-此mock仅用于避免您等待超时
it("allows use in a single spec", function() {
var onSuccess = jasmine.createSpy('success');
jasmine.Ajax.withMock(function() {
ajax({
url: 'JSON.php',
dataType: 'json',
onSuccess: onSuccess
});
expect(onSuccess).not.toHaveBeenCalled();
jasmine.Ajax.requests.mostRecent().respondWith({
"status": 200,
"responseText": '{"some": "json"}'
});
expect(onSuccess).toHaveBeenCalledWith('{"some": "json"}');
});
});