我开始为我的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库解决此问题,但是我对从哪里开始没有很好的了解。 如果有人能为我指出正确的方向,以开始为这段代码编写一些测试,我将非常感激。
答案 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调用”。