2016-03-15 1 views
4

J'ai un cas de test de composant de travail actif déjà avec mocha utilisant sinon capable de simuler un appel ajax mais avec l'aide de setTimeout(function(){}, 100) et Je n'aime pas l'utiliser.Comment simuler un appel ajax en moka en utilisant sinon sans définir le délai sur un composant ractif en utilisant le magasin de reflux

beforeEach(function() { 
    this.container = document.createElement('div'); 
    document.body.appendChild(this.container); 

    this.server = sinon.fakeServer.create(); 
    this.server.respondWith(
    "GET", 
    "/api/url", 
    [ 
     200, 
     { "Content-Type": "application/json" }, 
     '{"data": []}' 
    ] 
); 
}); 

afterEach(function() { 
    document.body.removeChild(this.container); 
}); 

it("should fetch data from server", function (done) { 
    var server = this.server; 
    var Component = require('rvc!path/to/component'); 
    var component = new Component({ 
    el: this.container, 
    }); 

    setTimeout(function() { 
    server.respond(); 

    expect(component.findAll('.list li').length).to.equal(7); 
    done(); 
    }, 100); 

}); 

Comme vous pouvez le voir dans le code ci-dessus, j'utilise le setTimeout pour vous assurer que l'appel ajax (maquette) a été faite avant d'avoir le test réel du composant.

Y a-t-il un moyen d'éliminer le setTimeout ayant le même effet? Merci!

+0

Comment les données obtenir du serveur simulé au composant? – martypdx

Répondre

3

En supposant que votre requête http est en cours dans le composant, il n'obtiendra pas les données avant la prochaine coche de la boucle d'événements.

Une approche consiste à utiliser setTimeout comme vous l'avez fait, mais vous pouvez probablement réduire le délai (utilisez autoRespondAfter pour ajuster le délai de réponse sinon).

Si votre code de composant prend en charge, une approche qui semble bien adapté à votre cas d'utilisation de la sinon fakeServer docs serait d'utiliser l'option respondImmediately:

Si elle est définie, le serveur répondra à toutes les demandes immédiatement et de manière synchrone. Ceci est idéal pour truquer le serveur à partir d'un test sans avoir à appeler server.respond() après chaque requête faite en ce test. Comme cela est synchrone et immédiat, cela ne convient pas pour simuler la latence réelle du réseau dans les tests ou les maquettes.

this.server = sinon.fakeServer.create({ respondImmediately: true }) 

// now no need to call server.respond() and calls are returned synchronously! 
+0

Merci pour la sortie. :) –

+0

Que voulez-vous dire par «si vos codes de composants le supporte»? J'ai essayé responseImmediately mais j'ai encore besoin d'ajouter le setTimeout. respondImmediately semble fonctionner puisque je n'ai pas besoin du serveur.respond() pour que le serveur réponde. –

+0

Je veux dire que changer une API qui devrait être synchrone asynchrone peut avoir des conséquences voulues si le code n'a pas été écrit dans cet esprit. – martypdx