如何使用Chai、Sinon、Mocha测试Node.js中的控制器
我一直在学习如何编写更好的单元测试。我正在从事一个项目,其中控制器遵循如下所示的“MyController”样式。基本上是一个“异步”函数,它在许多外部调用中“等待”并返回一个状态和结果。我已经为内部函数“dbResults”编写了一个非常基本的测试。但是,我不确定如何测试整个控制器函数本身是否返回某个值。在下面的例子中。我想知道是否有人能帮我找出测试函数最终结果的正确方法,比如“getUserWithId”。下面编写的代码非常接近,但并不完全是我实现的代码。如有任何建议,将不胜感激 控制器如何使用Chai、Sinon、Mocha测试Node.js中的控制器,node.js,mocha.js,chai,sinon,Node.js,Mocha.js,Chai,Sinon,我一直在学习如何编写更好的单元测试。我正在从事一个项目,其中控制器遵循如下所示的“MyController”样式。基本上是一个“异步”函数,它在许多外部调用中“等待”并返回一个状态和结果。我已经为内部函数“dbResults”编写了一个非常基本的测试。但是,我不确定如何测试整个控制器函数本身是否返回某个值。在下面的例子中。我想知道是否有人能帮我找出测试函数最终结果的正确方法,比如“getUserWithId”。下面编写的代码非常接近,但并不完全是我实现的代码。如有任何建议,将不胜感激 控制器 e
export const MyController = {
async getUserWithId(req, res) {
let dbResults = await db.getOneUser(req.query.id);
return res.status(200).json({ status: 'OK', data: dbResults });
}
}
电流测试
describe ('MyController Test', () => {
describe ('getUserWithId should return 200', () => {
before(() => {
// create DB stub
});
after(() => {
// restore DB stub
});
it('should return status 200', async () => {
req = // req stub
res = // res stub
const result = await MyController.getUserWithId(req, res);
expect(res.status).to.equal(200);
});
});
});
我建议使用
集成测试
来测试控制器,而不是单元测试
集成测试
将应用程序视为黑匣子,其中网络是输入(HTTP请求),第三方服务是应模拟的依赖项(DB)
- 对服务、工厂和UTIL使用单元测试
- 对HTTP和WebSocket等外部接口使用集成测试
您也可以添加
e2e测试
,但如果您的设置中只有一个组件,则集成测试
就足够了。等待。您的控制器是否会抛出一个错误无法调用未定义的函数状态
,因为res
在任何地方都没有定义?您是正确的。我只是提供了伪代码。我正在添加它。如果您只想在不实际实现调用getUserWithId
的情况下测试controller函数,您可以模拟getUserWithId
函数。如果您想检查e2e实现,我建议通过移动到itw自己的DAL层,为getUserWithId函数创建单独的单元测试