Node.js - Как проверить HTTPS-запросы с обещанием - PullRequest
0 голосов
/ 02 января 2019

Я начал писать модульные тесты для своего приложения nodeJs, чтобы узнать об этой концепции. После написания некоторых базовых тестов для простых функций (с использованием Mocha и Chai) я хочу перейти к более сложным тестам.

Я написал простой кусок кода, который может сделать запрос, используя HTTPS-модуль узла. Этот код выглядит так:

const https = require('https')
 module.exports.doRequest = 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()
  })
}

Теперь я хочу вызвать этот метод со следующими параметрами:

const PARAMS = {
    host: 'jsonplaceholder.typicode.com',
    port: 433,
    method: 'GET',
    path: `/todos/1`,
    headers: {
      Authorization: 'Bearer 123'
    }
}

И сделайте запрос вот так:

getTodos = (PARAMS) => {
  return doRequest(PARAMS).then((result) => {
    if (result.errors) { throw result }
    return {
      'statusCode': 200,
      'body': JSON.stringify({ message: result.title }),
    }
  }).catch((error) => ({
      'statusCode': error.statusCode,
      'body': JSON.stringify({ message: error.message }),
    }
  ))
}

Теперь мой вопрос: как я могу правильно проверить этот бит кода? Я посмотрел, как справиться с этим с помощью библиотеки Nock.js, но у меня нет хорошего понимания, с чего начать. Если кто-то может указать мне правильное направление о том, как начать писать несколько тестов для этого фрагмента кода, я буду благодарен.

1 Ответ

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

Как правило, вы хотели бы включить «черный ящик» в обработку HTTP, чтобы как можно меньше модулей вашего приложения заботились о деталях HTTP.

В исходной папке вы должны иметьодин модуль (например, commonhttp.js).Вы хотите, чтобы это экспортировало ваши функции HTTP, и другие модули в вашем приложении используют их следующим образом:

const commonhttp = require('./commonhttp');
commonhttp.doRequest( ... ).then( ... );

Другие модули, такие как todos.js, и различные другие модули, будут экспортировать свои собственные функции, используя этот модульНапример:

const commonhttp = require('./commonhttp');

const todos = {
    getTodos( ... ) {
        return commonhttp.doRequest( ... );
    },

    createTodo( ... ) {
        return commonhttp.doRequest( ... );
    },

    // etc.
};

module.exports = todos;

Для ваших модульных тестов, когда вы тестируете модуль todos.js, вы хотите смоделировать любые вызовы к модулю commonhttp;для этого вы можете использовать простой mocha + Sinon и следить за методом doRequest.По сути, все, что вы тестируете, это «когда я вызываю getTodos, я ожидаю, что он вызовет doRequest с этими аргументами».Вы будете следовать этому шаблону для всех модулей в вашем приложении, которые используют doRequest.

Вы также, конечно, хотите проверить модуль commonhttp - , в спецификации которого находится Nockможет пригодиться.Это не является строго необходимым, вы также можете «заблокировать» модуль http, но вам нужно настроить множество сложных шпионов, чтобы имитировать поведение http;вместо этого написание спецификации (с использованием Nock), которая говорит: «Хорошо, я вызываю doRequest с этими параметрами, которые должны были сделать этот HTTP-вызов», имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...