考虑以下功能(简化,缩短可读性):
function testMe(a)
{
var request = require('request');
return new Promise((resolve, reject)=>{
request.get('someexternalulr?a='+a, (error, response, body) => {
if (error === null)
{
switch(body)
{
case 'one thing':
resolve(true);
break;
case 'something else':
reject(whatever);
break;
// more logic
}
}
else
{
reject(error);
}
});
});
}
它调用外部API,应用一些逻辑来分析响应,并返回一个promise。 如果我编写一个jasmine测试,那么每次测试都会调用API,这种测试很好。然而,我有兴趣测试我自己的逻辑,而不是外部API。
测试此类功能的最佳做法是什么?
a)将请求模块的依赖关系作为函数的第二个参数传递?
b)将请求移动到全局变量?
c)其他一些诡计?
答案 0 :(得分:1)
您需要使用模拟库。 sinon是一个受茉莉花欢迎的图书馆。
const sinon = require('sinon');
const request = require('request');
sinon.stub(request, 'get').yields(null, {}, "<h1>Tarun lalwani</h1>");
const {testMe} = require('./index');
describe("A suite is just a function", function () {
it("should testMe", function (done) {
console.log("we are here")
testMe("tarun").then(data => {
console.log("data", data);
done();
});
})
});
修改了导出导入功能的代码
module.exports = {
testMe: function testMe(a) {
var request = require('request');
return new Promise((resolve, reject) => {
request.get('http://vm:8088/?a=' + a, (error, response, body) => {
console.log("response", error,response,body)
if (error === null) {
switch (body) {
case 'some thing else':
reject(whatever);
break;
case 'one thing':
resolve(true)
break;
default:
resolve(body);
break;
}
}
else {
reject(error);
}
});
});
}
}