在将 Supertest 与 mock-fs 和 Jest 结合使用时无法 post 数据
Not able to post data while using Supertest with mock-fs and Jest
我正在尝试将 POST 请求发送到我的 '/convert' 路由,但我正在获取正文该路线中的空物体。我正在使用 Supertest 和 mock-fs(模拟我的文件系统)。如果我从我的测试文件中删除 mock({...}) 方法并尝试发送相同的 POST 请求,那么它工作得很好。在不使用 mock({...}) 方法的情况下,我在 '/convert' 路由中得到了 req.body 值。我希望 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;
不确定您是否应该在 testdata 对象的最后一个值上使用逗号 'filename: test
这是花了几天时间的解决方案。为了从请求中获取正文,我们需要 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 })
});
我正在尝试将 POST 请求发送到我的 '/convert' 路由,但我正在获取正文该路线中的空物体。我正在使用 Supertest 和 mock-fs(模拟我的文件系统)。如果我从我的测试文件中删除 mock({...}) 方法并尝试发送相同的 POST 请求,那么它工作得很好。在不使用 mock({...}) 方法的情况下,我在 '/convert' 路由中得到了 req.body 值。我希望 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;
不确定您是否应该在 testdata 对象的最后一个值上使用逗号 'filename: test
这是花了几天时间的解决方案。为了从请求中获取正文,我们需要 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 })
});