2017-08-23 3 views
1

J'apprends actuellement sinon. Mes codes:promettre un retard au moka

const bluebird = require('bluebird'); 
const sinon = require('sinon'); 
const sinonTest = require('sinon-test')(sinon); 

sinon.test = sinonTest; 

describe('xxx', function _test() { 
    this.timeout(2000); 
    it('should', sinon.test(function() { 
    return new bluebird.Promise((resolve, reject) => { 
     try { 
     console.log('123'); 
     resolve(); 
     } catch (err) { 
     reject(err); 
     };  
    }) 
    .then(() => console.log('456')) 
    .delay(100) 
    .then(() => console.log('789')) 
    .then(function() { 
    }) 
    })); 
}); 

sortie:

xxx 
    123 
    456 

Pourquoi les temps de code ci-dessus et sur coincés dans delay? Merci

MISE À JOUR

const bluebird = require('bluebird'); 
const sinon = require('sinon'); 
const sinonTest = require('sinon-test')(sinon); 

sinon.test = sinonTest; 

describe('xxx', function _test() { 
    this.timeout(2000); 
    it('should', sinon.test(function() { 
    return bluebird 
    .delay(100) 
    .then(() => console.log('789')); 
    })); 
}); 

Sortie:

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves 

MISE À JOUR

Merci @Louis. Réglage useFakeTimers fonctionne très bien.

Mais je suis juste confus. Pourquoi dans mon projet, il n'y a pas de problèmes avec les tests existants où useFakeTimers mis à true par défaut? Si useFakeTimers est défini sur true, le délai de promesse ne peut pas être utilisé dans sinonTest()? Par ailleurs, j'ai eu ce problème lors de la mise à niveau sinon de 1.17.6 à 2.4.1. Merci

Répondre

0

Par défaut, les sandbox créés par Sinon ont leur configuration configurée de sorte que l'option de configuration du bac à sable useFakeTimers soit true. Cela signifie que tant que le bac à sable est en vigueur, l'horloge semble être arrêtée, et le delay de Bluebird ne se résout jamais. Vous indiquez sinon-test pour créer des sandbox sans fausses minuteries en transmettant un second paramètre lorsque vous le configurez. Ce 2ème paramètre est en fait un objet de configuration pour sandboxes SINON:

const sinonTest = require('sinon-test')(sinon, 
             { useFakeTimers: false }); 

Je ne l'ai pas essayé, mais de eyeballing le code, il semble que vous pouvez utiliser plusieurs configurations en même temps si vous avez besoin des tests à utiliser minuteries faux et certains de ne pas utiliser des minuteries faux:

const sinonTest = require('sinon-test'); 
const wrapper = sinonTest(sinon, { useFakeTimers: false }); 
const wrapperWithTimers = sinonTest(sinon); 

Vous avez juste besoin d'utiliser l'emballage juste pour les besoins du test.


vous avez ajouté la question suivante:

Mais je suis tout confus. Pourquoi dans mon projet, il n'y a pas de problèmes avec les tests existants où useFakeTimers mis à true par défaut? Si useFakeTimers est défini sur true, le délai de promesse ne peut pas être utilisé dans sinonTest()?

Par défaut useFakeTimers est true, mais cela ne causera pas un problème, sauf si vous avez le code qui dépend de l'horloge aller de l'avant pour fonctionner correctement. J'ai beaucoup de suites de test où j'utilise des bacs à sable et où je n'ai pas pris soin d'éteindre les fausses minuteries et ils fonctionnent bien.Faux minuteurs ne généralement empêcher les fonctions asynchrones de s'exécuter. Si vous faites fs.readFile pendant que le bac à sable est en vigueur, par exemple, cela devrait fonctionner correctement. Il affecte juste les fonctions qui dépendent de l'horloge, comme setTimeout, setInterval et Date.

La méthode de Bluebird est affectée car calls setTimeout.

+0

Si '{useFakeTimers: false}' est défini, 'delay' ne fonctionnera pas? – BAE

+0

Je prends le code dans votre question, le plop dans un nouveau fichier, éditez pour ajouter le 2ème paramètre '{useFakeTimers: false}', installez les paquets requis et exécutez Mocha et cela fonctionne. Je reçois toutes les sorties 'console.log' et il n'y a pas de temps mort. Cela a fonctionné quand je l'ai fait avant d'écrire ma réponse et cela fonctionne maintenant. Vous devez faire quelque chose de mal. – Louis

+0

oui. il fonctionne maintenant. Vous avez résolu plusieurs questions à moi. Merci. Mais je suis juste confus. Pourquoi dans mon projet, il n'y a pas de problèmes avec les tests existants où 'useFakeTimers' n'est pas défini? – BAE