Как создать заглушку для функции AJAX, используя Jasmine BDD - PullRequest
4 голосов
/ 16 января 2012

Я изо всех сил пытаюсь найти какие-либо примеры того, как подделать вызов ajax с помощью Jasmine BDD?

У меня есть пользовательская функция ajax, которая работает так ...

ajax({
    url: 'JSON.php',
    dataType: 'json',           
    onSuccess: function(resp) {
        console.log(resp);
    }
});

... и я не знаю, как создать заглушку для фальсификации, вызывая реальную функцию ajax.

Я хочу избежать вызова функции ajax, так как это может замедлить мой набор тестов, если настоящий вызов ajaxсерверу требуется некоторое время, чтобы ответить, и у меня есть множество спецификаций в моем наборе тестов.

Я слышал, что вы можете использовать spyOn(namespace, 'ajax'), но это сразу раздражает, так как требует, чтобы я завернул свой ajax функция в объекте просто для использования функции spyOn (но, несмотря на это, я не смог следовать, так как не смог найти конкретных примеров для подделки вызова ajax).

У меня естьтакже слышал, что вы можете использовать createSpy(), но опять-таки документация не очень полезна (как и соответствующая вики на GitHub).

Любая помощь, объясняющая, как использовать шпионов для создания поддельного вызова ajax, будет очень полезнаоценили!

Ответы [ 3 ]

4 голосов
/ 17 января 2012

Вы можете использовать SinonJS mocking framework, который имеет встроенный фальшивый сервер .Вы можете легко использовать его с жасмином:

beforeEach(function() {
        server = sinon.fakeServer.create();
        server.respondWith([200, { "Content-Type": "text/html", "Content-Length": 2 }, "OK"])
});

Кстати.если ваша функция ajax находится в глобальном пространстве имен, почему бы не вызвать spyOn(window, 'ajax')

0 голосов
/ 12 августа 2017

Если вы согласны не с шпионами, а с надстройкой jasmine-ajax .Чтобы подделать одну спецификацию, используйте withMock:

  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.Ссылка выше имеет несколько инструкций по установке

0 голосов
/ 21 августа 2012

Относительно одной функции, вы можете использовать 'createSpy':

/*var */ajax = createSpy('foo');

var отсутствует, потому что вы хотите переопределить его, но затем требуется, чтобы блок, в котором вы определяете этого шпиона, был связан с той же областью, где был определен реальный ajax. Или, если вы перепутали с этим, используйте spyOn(window, foo), потому что вы все равно тестируете его в браузере.

Подробнее см. в этом ответе .

Что касается вызова ajax, см. Асинхронная поддержка раздел в новые документы , или лучше использовать Часы :

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();
...