简体   繁体   中英

How to test a controller in Node.js using Chai, Sinon, Mocha

I've been learning how to write better unit tests. I am working on a project where controllers follow the style of 'MyController' shown below. Basically an 'async' function that 'awaits' on many external calls and returns a status with the results. I have written a very basic test for an inner function 'dbResults'. However, I am unsure of how to go about testing if the entire controller function itself returns a certain value. In the example below. I was wondering if anyone can help me figure out what is the proper way to test the final result of a function such as 'getUserWithId'. The code written below is very close but not exactly what I have implemented. Any suggestions would be appreciated.

Controller

export const MyController = {
  async getUserWithId(req, res) {
    let dbResults = await db.getOneUser(req.query.id);
    return res.status(200).json({ status: 'OK', data: dbResults });
  }
}

Current Test

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);
     });
   });
});

I would suggest using an integration-test for testing your controller rather than a unit-test .

integration-test threats the app as a black box where the network is the input (HTTP request) and 3rd party services as dependency that should be mocked (DB).

  • Use unit-test for services, factories, and utils.
  • Use integration-test for external interfaces like HTTP and WebSockets

You can add e2e-test as well but if you have only one component in your setup you integration-test will suffice.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM