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

时间:2019-01-02 15:42:15

标签: javascript node.js unit-testing testing mocking

我开始为我的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 :(得分:1)

通常,您希望对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调用”。