【问题标题】:Not able to post data while using Supertest with mock-fs and Jest使用带有 mock-fs 和 Jest 的 Supertest 时无法发布数据
【发布时间】:2021-01-02 13:55:48
【问题描述】:

我正在尝试将 POST 请求发送到我的 '/convert' 路由,但我在该路由中将 body 作为空对象。我正在使用 Supertestmock-fs(模拟我的文件系统)。如果我从我的测试文件中删除 mock({...}) 方法并尝试发送相同的 POST 请求,那么它工作得很好。我在 '/convert' 路由中获得了 req.body 值,而没有使用 mock({...}) 方法。我希望 mock-fs 在使用 Supertest 发送 POST 请求时工作,并且主体应该在“/convert”路由中可用。

请帮助或建议我做错了什么,因为我已经搜索了很多但无法获得有关这种情况的任何有用信息。

// testing.spec.ts

import request from 'supertest';
import mock from 'mock-fs';

describe('Converts HTML to PDF', () => {
    beforeEach(() => {

            const mockStorage = {
                mode: 0o777,
                items: {
                    '654321': mock.directory({mode: 0o775})
                }
            }

            const mockAppDirectory = {
                mode: 0o777,
                items: {
                    'storage': mock.directory(mockStorage)
                }
            }

            mock({
                '/app': mock.directory(mockAppDirectory)
            })

    });
    afterEach(function() {
        mock.restore();
    });

    test('test', async (done) => {
        const testData = {
          header:"test",
           footer:"test",
           body:"test",
           dpi:200,
           filename:"test",
        };
        const res = await request(app)
                    .post('/convert')
                    .send(testData)
                    .expect(200)
                    
        done();
    });
})


// testRoute.ts

import express from "express";
const router = express.Router();

router.post('/convert', async (req: Request, res: Response) => {
    console.log(JSON.stringify(req.body));
);

export default router;

【问题讨论】:

    标签: node.js unit-testing mocking jestjs supertest


    【解决方案1】:

    这是花费几天后的解决方案。为了从请求中获取正文,我们需要 body-parser 并且 body-parser 存在于 node_modules 目录中。默认情况下,所有文件都在 mock-fs 中延迟加载,因此 mock-fs 仅模拟和加载我们使用 mock 函数指定的目录。在我的代码中,我没有显式加载 node_modules 目录,因此 mock-fs 不知道 body-parser 模块。因此,我尝试显式加载 node_modules 并像魅力一样工作。

    mock({
         // @ts-ignore
         'node_modules': mock.load(path.resolve('node_modules')),
         '/app': mock.directory({ mode: 0o775 })
    });
    

    【讨论】:

      【解决方案2】:

      不确定是否应该在 testdata object 'filename: test 的最后一个值上加逗号

      【讨论】:

      • 我试过去掉逗号,但还是不行。
      • 你能澄清一下路由句柄返回的是什么,显然不是console.log吗?
      • 它在应用大量业务逻辑后返回 JSON 数据,但问题是我没有在请求正文中获取任何数据。好消息是我找到了解决问题的方法,我会尽快上传。感谢您的关注。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 2020-06-02
      • 2022-08-18
      • 2019-07-13
      • 2019-07-31
      • 1970-01-01
      相关资源
      最近更新 更多