Node.js - фиктивный результат обещания - PullRequest
0 голосов
/ 06 января 2019

Я хочу смоделировать результат функции в модуле узла, чтобы я мог запускать утверждения. Учитывая следующий модуль узла:

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;
  })
}

Функция doPostRequest возвращает обещание. Как я могу подделать возвращаемое значение этого обещания, чтобы я мог утверждать, что normalizeSucessResult был вызван? Ибо я попробовал:

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");
  });
});

Модуль doPostRequest выглядит следующим образом:

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()
  })
}

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Чтобы заглушить свой функционал, вам нужно сделать вот так

sinon.stub({doPostRequest}, 'doPostRequest').resolves("some response data")

0 голосов
/ 08 января 2019

Хорошо, я понял это. Функция doPostRequest была загружена с помощью require, вверху файла - const doPostRequest = require('./doPostRequest.js').doPostRequest;

Чтобы смоделировать данные, возвращаемые функцией, загруженной с использованием require, мне пришлось использовать модуль узла с именем mock-require . Есть больше модулей, которые могут позаботиться об этом ( proxyquire является популярным), но я выбрал mock-require (у меня не было конкретной причины для выбора mock-require).

Для всех, кто столкнулся с подобной проблемой, попробуйте mock-require, чтобы смоделировать respose из файлов, загруженных с помощью require.

0 голосов
/ 06 января 2019

Вы можете использовать Promise.resolve , чтобы вернуть обещание с любым заданным значением.

Promise.resolve(“hello world”);
...