2017-07-14 1 views
0

Ci-dessous j'ai un peu de code pour démontrer comment je suis en train de tester/céder une promesse, la fonction ci-dessous useSpyPromise utilise l'argument prometteur spyPromise. Im essayant de comprendre comment je peux spécifier le talon pour retourner une promesse sur le premier appel (Promise.resolve(['hasLength']) et la promesse différente résolue sur le deuxième appel (Promise.resolve([]).sinon.stub(). Renvoie spécifié pour chaque appel plutôt qu'une fois

let spyPromise = sinon.stub().returns(Promise.resolve(['hasLength'])) 

function useSpyPromise (spyPromise) { 
    let promiseOne = spyPromise 
    .then(d => { 
     if (d.length === 0) throw new Error('d 0') 
     return d 
    }) 

    let promiseTwo = spyPromise 
    .then(d => { 
     if (d.length === 1) throw new Error('d 1') 
     return d 
    }) 

    return {promiseOne, promiseTwo} 
} 

Répondre

0

Il est difficile de dire exactement ce que vous voulez mais une chose semble assez certaine; fournir les tests sont synchrones - ie. aucune autre promesse n'est impliquée - alors vous n'avez pas besoin promise1 et promise2, juste return spyPromise.then(...).

Vous pouvez juste le comportement à déterminer entièrement par d.length, auquel cas il est aussi simple que:

function useSpyPromise(spyPromise) { 
    return spyPromise.then(d => { 
     if(d.length <= 1) { 
      throw new Error('d ' + d.length); 
     } 
     return d; 
    }); 
} 

Cependant, si vous voulez vraiment le nombre de fois que la fonction est appelée à prendre en compte, alors peut-être quelque chose comme ceci:

var count = 0; 
function useSpyPromise(spyPromise) { 
    count += 1; 
    return spyPromise.then(d => { 
     if(count === 0 && d.length === 0) { 
      throw new Error('d 0'); 
     if(count === 1 && d.length === 1) { 
      throw new Error('d ' + d.length); 
     } 
     return d; 
    }); 
} 

C'est une chose assez bizarre de vouloir, mais peut-être est ce que votre application nécessite. Je ne peux pas le dire.

De toute façon, ce n'est pas la fin de l'histoire. Vous pouvez formuler les tests de plusieurs façons. Par exemple, un lancer de condition count > 1 devrait-il se produire? La question ne le dit pas, mais avez-vous considéré ces cas? Ce que vous écrivez dépend du comportement précis que vous voulez.