2017-06-26 1 views
1

J'utilise un service de repos tiers pour l'envoi de code de vérification SMS. J'ai écrit un test unitaire pour cela. Cependant, je ne veux pas être envoyé un message chaque fois que je lance l'unité-test.bibliothèque de requêtes stub en javascript

Le code est comme:

const _request = require("request"); 

    _request({ 
    method: "POST", 
    url: "http://blah.com/json", 
    form: { 
    apikey: "blah", 
    mobile: input.mobilePhoneNumber, 
    text: `code is: ${verificationCode}`, 
    } 
}, (err, res, body) => { 
    if (err) { 
    dbg(`end, output=${err}`) 
    return reject(new Error("something wrong")) 
    } else { 
    dbg(`end, output=${res}`) 
    return resolve({}) 
    } 
}) 

Et dans le test Im en utilisant sinon.stub

sinon.stub(request, "post").returns(Promise.resolve({})) 

Toutefois, ce ne marche pas vraiment talon attraper la méthode "post" à la demande. J'ai regardé dans le code source et j'ai essayé de nombreuses façons (comme remplacer le constructeur à la place), mais aucun ne fonctionne. Vous vous demandez si quelqu'un a déjà essayé cela auparavant? Comment dois-je talonner cette méthode de publication sur demande?

Merci!

+0

Qu'est-ce que 'request' dans votre test unitaire? – robertklep

+0

c'est cette lib: https://github.com/request @robertklep –

+0

Raison que je demandais parce que votre code n'appelle pas 'request.post()' (il appelle 'request') et la bibliothèque' request' lui-même ne supporte pas les promesses (le retour d'une promesse d'un talon n'a donc pas de sens). – robertklep

Répondre

3

Votre code n'appelle pas le request.post(), donc il ne rattrapera pas l'appel que vous faites. Au lieu de cela, vous devez remplacer la fonction request elle-même, ce qui est difficile à faire avec Sinon seul car elle nécessite un objet "parent" dans lequel elle peut remplacer/remplacer une méthode/fonction.

Vous pouvez travailler autour qu'utiliser proxyquire, que vous pouvez utiliser pour « attraper » l'importation de request et le remplacer par un talon:

const sinon  = require('sinon'); 
const request = require('request'); 
const proxyquire = require('proxyquire'); 

let stub = sinon.stub(); 
const mod = proxyquire('./your-module', { request : stub }); 

Dans votre cas de test, vous pouvez faire stub céder à la rappel vous passez:

let fakeError = null; 
let fakeResponse = {}; 
let fakeBody  = ''; 

stub.reset(); 
stub.yields(fakeError, fakeResponse, fakeBody); 

Les arguments à yields représentent err, res et body dans votre code. Vous pouvez passer différentes combinaisons pour vérifier si votre code gère correctement les réponses.

La raison pour laquelle vous appelez stub.reset() est que vous devez vous assurer, avant chaque test, que le talon est réinitialisé à son état d'origine (il commence alors "frais").