如何使用Jasmine BDD为ajax函数创建存根

时间:2012-01-16 17:44:48

标签: ajax unit-testing bdd jasmine

我很难找到关于如何使用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调用都将非常感激!

2 个答案:

答案 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();