Question

J'ai du mal à trouver des exemples sur la façon de simuler un appel Ajax en utilisant Jasmine BDD?

J'ai une fonction AJAX personnalisée qui fonctionne comme ...

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

... et je ne sais pas comment créer un talon pour faux appelant la fonction AJAX réelle.

Je veux éviter d'appeler la fonction AJAX car elle pourrait ralentir ma suite de test si un véritable appel Ajax au serveur prend un certain temps pour répondre et j'ai beaucoup de spécifications dans ma suite de tests.

J'ai entendu dire que tu peux utiliser spyOn(namespace, 'ajax') Mais c'est ennuyeux tout de suite car cela me nécessite d'envelopper mon ajax fonction dans un objet juste pour utiliser le spyOn Fonction (mais peu importe, je n'ai pas pu suivre car je n'ai pas trouvé d'exemples spécifiques pour simuler un appel ajax).

J'ai aussi entendu dire que tu peux utiliser createSpy() Mais encore une fois, la documentation n'est pas très utile (le wiki correspondant n'est pas non plus sur GitHub).

Toute aide expliquant comment utiliser les espions pour créer un faux appel Ajax serait grandement apprécié!

Était-ce utile?

La solution

Vous pouvez utiliser Sinonjs Mocking Framework, qui a une construction dans serveur. Vous pouvez facilement l'utiliser avec le jasmin:

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

D'ailleurs. Si votre fonction AJAX est dans l'espace de noms global, pourquoi ne pas appeler spyOn(window, 'ajax')

Autres conseils

En ce qui concerne une seule fonction, vous pouvez utiliser «CreateSpy»:

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

var est absent parce que vous voulez le redéfinir, mais il est alors nécessaire que le bloc où vous définissez cet espion soit lié à la même portée où ajax a été défini. Ou, si vous confondez avec cela, utilisez spyOn(window, foo), parce que vous le testez de toute façon dans le navigateur.

Voir Cette réponse pour plus de détails.

Concernant l'appel Ajax, voir Support asynchrone section dans nouveaux documents, ou mieux utiliser L'horloge:

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

Si vous n'êtes pas d'accord avec ne pas utiliser d'espions, mais à la place le module complémentaire jasmin-ajax. Se moquer d'une seule utilisation de spécifications 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"}');
    });
  });

La réponse n'est envoyée que lorsque vous utilisez respondWith. Le lien ci-dessus a des instructions comment installer

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top