如何使用Jasmine BDD为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调用需要

我很难找到任何关于如何使用Jasmine BDD伪造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
不存在,因为您想重新定义它,但是需要将定义此间谍的块绑定到定义real
ajax
的相同范围。或者,如果您对此感到困惑,请使用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"}');
    });
  });