如何使用Chai、Sinon、Mocha测试Node.js中的控制器

如何使用Chai、Sinon、Mocha测试Node.js中的控制器,node.js,mocha.js,chai,sinon,Node.js,Mocha.js,Chai,Sinon,我一直在学习如何编写更好的单元测试。我正在从事一个项目,其中控制器遵循如下所示的“MyController”样式。基本上是一个“异步”函数,它在许多外部调用中“等待”并返回一个状态和结果。我已经为内部函数“dbResults”编写了一个非常基本的测试。但是,我不确定如何测试整个控制器函数本身是否返回某个值。在下面的例子中。我想知道是否有人能帮我找出测试函数最终结果的正确方法,比如“getUserWithId”。下面编写的代码非常接近,但并不完全是我实现的代码。如有任何建议,将不胜感激 控制器 e

我一直在学习如何编写更好的单元测试。我正在从事一个项目,其中控制器遵循如下所示的“MyController”样式。基本上是一个“异步”函数,它在许多外部调用中“等待”并返回一个状态和结果。我已经为内部函数“dbResults”编写了一个非常基本的测试。但是,我不确定如何测试整个控制器函数本身是否返回某个值。在下面的例子中。我想知道是否有人能帮我找出测试函数最终结果的正确方法,比如“getUserWithId”。下面编写的代码非常接近,但并不完全是我实现的代码。如有任何建议,将不胜感激

控制器

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函数创建单独的单元测试