1
votes

Node.js - Résultat simulé d'une promesse

Je veux me moquer du résultat d'une fonction dans un module de nœud afin de pouvoir exécuter des assertions. Considérant le module nœud suivant:

const https = require('https')
 module.exports.doPostRequest = function (params, postData) {
  return new Promise((resolve, reject) => {
    const req = https.request(params, (res) => {
      let body = []
      res.on('data', (chunk) => {
        body.push(chunk)
      })
      res.on('end', () => {
        try {
          body = JSON.parse(Buffer.concat(body).toString())
        } catch (e) {
          reject(e)
        }
        resolve(body)
      })
    })
    req.on('error', (err) => {
      reject(err)
    })
    if (postData) {
      req.write(JSON.stringify(postData))
    }
    req.end()
  })
}

La fonction doPostRequest renvoie une promesse. Comment puis-je simuler la valeur de retour de cette promesse afin de pouvoir affirmer si normalizeSucessResult a été appelé? Donc, j'ai essayé:

const normalizeSucessResult = require('./normalizer.js');
const doPostRequest = require('./doPostRequests.js');
const doPost = require('./doPost.js');

it('runs a happy flow scenario', async () => {
  let normalizeSucessResultStub = sinon.stub(normalizeSucessResult, 'normalizeSucessResult');
  let postData = { body: 'Lorum ipsum' };
  let params = { host: 'someUrl', port: 433, method: 'POST', path: '/' };

  sinon.stub(doPostRequest, 'doPostRequest').resolves("some response data"); //Fake response from doPostRequest

  return doPost.doPost(params, postData).then((res) => { //res should be equal to some response data
    expect(normalizeSucessResultStub).to.have.been.calledOnce;
    expect(normalizeSucessResultStub).to.have.been.with("some response data");
  });
});

Le module doPostRequest ressemble à ceci:

const doPostRequest = require('./doPostRequest.js').doPostRequest;
const normalizeSucessResult = require('./normalizer.js').normalizeSucessResult;
const normalizeErrorResult = require('./normalizer.js').normalizeErrorResult;

exports.doPost = (params, postData) => {
  return doPostRequest(params, postData).then((res) => {
    const normalizedSuccessResult = normalizeSucessResult(res);
    return normalizedSuccessResult;
  }).catch((err) => {
    const normalizedErrorResult = normalizeErrorResult(err);
    return normalizedErrorResult;
  })
}

p >


3 commentaires

Où est défini doPostRequest? Veuillez poster tout le code pertinent.


Le module doPostRequest est défini dans un fichier séparé. J'ai mis à jour le code afin de montrer où il vit. Si vous avez des idées sur la façon de résoudre ce problème, partagez-les. Je deviens de plus en plus confus de minute en minute ...


Je ne suis pas à la hauteur de la réponse détaillée, mais vous devez vous moquer du module d'où doPostRequest a été exporté (avec Proxyquire ou quelque chose de similaire) et le faire avant d'importer le module où il est utilisé la première fois (c'est-à-dire le module doPost). Vous ne pouvez pas faire cela avec Sinon. Vous ne pouvez vous moquer des méthodes existantes qu'avec Sinon, alors que doPostRequest est utilisé comme une fonction et non comme une méthode. Btw, Jest gère le module moqueur de manière native, vous pouvez le faire plus facilement en y basculant.


3 Réponses :


7
votes

Vous pouvez utiliser Promise.resolve pour renvoyer une promesse avec une valeur donnée.

Promise.resolve(“hello world”);


1 commentaires

Merci pour votre aide, j'ai essayé cela dans mon code avec sinon.stub (doPostRequest, 'doPostRequest'). Resolves ("some response data"); . Que lorsque j'appelle la méthode, res devrait être égal à certaines données de réponse , mais ce n'est pas le cas. Pouvez-vous me montrer comment je peux l'utiliser dans mon test pour que res soit égal à certaines données de réponse ?



0
votes

Pour stub votre func, vous devez faire comme ceci

sinon.stub ({doPostRequest}, 'doPostRequest'). resolves ("quelques données de réponse")


0 commentaires

0
votes

D'accord, j'ai compris. La fonction doPostRequest a été chargée en utilisant require , en haut du fichier en utilisant const doPostRequest = require ('./ doPostRequest.js'). DoPostRequest;

Afin de me moquer des données qui reviennent d'une fonction chargée à l'aide de require , j'ai dû utiliser un module de nœud appelé mock-require . Il y a plus de modules qui peuvent s'occuper de cela ( proxyquire est populaire) mais j'ai choisi mock- require (je n'avais pas de raison spécifique pour choisir mock-require).

Pour toute autre personne confrontée à un problème similaire, essayez mock-require pour simuler la réponse des fichiers chargés à l'aide de require .


0 commentaires