如何使用Jest测试快速控制器获取文件

xriantvc  于 2022-12-08  发布在  Jest
关注(0)|答案(1)|浏览(162)

我有一个使用Express的简单端点,允许用户下载csv文件。我应该如何仅使用Jest对文件下载端点进行测试
我不确定应该使用哪个函数或mock来测试这个场景,因为下面的测试返回Number of calls: 0
controller.js

const getFile = async (req, res, next) => {
try {
    res.setHeader('Content-Type', 'text/csv');
    res.setHeader('Content-Disposition', 'attachment; filename=sample.csv');
    const csv = 'ID\n1\n2\n3';
    res.send(csv);
  } catch (e) {
    next(
      new HttpException(
        'internal error',
        'file download error',
        e.message,
      ),
    );
  }
}

controller.test.js

test('should successfully download the csv', async () => {
      const mockReq = {};
      const mockRes = {
        send: jest.fn(),
      };
      await controller.getFile(mockReq, mockRes, jest.fn());
      
      expect(mockRes.send).toHaveBeenCalledWith({ 'Content-Type': 'text/csv' });
});
6yoyoihd

6yoyoihd1#

如果有人遇到类似的问题,我认为最简单的方法是使用supertest库。这个库支持HTTP assertions,所以我可以在路由级别进行测试:

const request = require('supertest');
...

const response = await request(app).get(
        '/api/.../download-file',
      );
expect(response.status).toEqual(200);
expect(response.headers['content-type']).toMatch('text/csv; charset=utf-8');
expect(response.headers['content-disposition']).toMatch(
        'attachment; filename=' + 'sample.csv',
);

相关问题