javascript - Node.js - 如何使用 promise 测试 HTTPS 请求

标签 javascript node.js unit-testing testing mocking

我开始为我的 nodeJs 应用程序编写单元测试,这样我就可以了解这个概念。 在为简单函数(使用 Mocha 和 Chai)编写了一些基本测试之后,我想继续进行一些更复杂的测试。

我写了一段简单的代码,可以使用 Node 的 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 库来解决这个问题,但我不太了解从哪里开始。 如果有人能指出正确的方向,告诉我如何开始为这段代码编写一些测试,我将不胜感激。

最佳答案

一般来说,您会希望对 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模块,但是你必须设置很多复杂的 spy 来模仿http的行为;相反,编写一个规范(使用 Nock)说“好的,我用这些参数调用 doRequest,应该进行这个 HTTP 调用”确实有意义。

关于javascript - Node.js - 如何使用 promise 测试 HTTPS 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54009161/

相关文章:

javascript - 使用 if 语句理解 jquery div 元素

javascript - 在 Node js 后端使用 FormData 和 XmlHttpRequest 上传文件并使用 Formidable 显示空文件、字段

javascript - Node.js - 检查字符串是否表示大量元素的有效日期时间的最快方法是什么?

javascript - 将附加参数传递给 Node js 中 fs.readFile 的回调

unit-testing - 如果一个方法调用另一个方法,是单元测试还是集成测试?

.net - 在 NUnit 中动态创建测试

javascript - jQuery 外部文本请求图像

javascript - 什么决定了可用的 ECMAScript 版本?

javascript - 没有 Node.js 我怎么能做 tweetnacl.sealedbox.seal?

django - South 是否搞乱了 Django 测试运行框架?