问题描述
我正在尝试将 POST 请求发送到我的'/ convert'路线,但是我在该路线中将主体作为空对象。我正在使用 Supertest 和 mock-fs (模拟我的文件系统)。如果我从测试文件中删除了模拟({...})方法,并尝试发送相同的 POST 请求,那么它的工作就很好。我在不使用模拟({...})方法的情况下,在'/ convert'路由中获得了 req.body 值。我希望模拟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_modules目录中。默认情况下,所有文件都是延迟加载到模拟Fs中的,因此模拟fs仅模拟并加载我们使用模拟功能指定的目录。在我的代码中,我没有显式加载node_modules目录,因此,mock-fs无法识别body-parser模块。因此,我尝试显式加载node_modules并像超级按钮一样工作。
controls = new THREE.OrbitControls(camera,scene);
,
不确定testdata对象'filename:test
中的最后一个值是否用逗号分隔