创建模拟文件而不是从磁盘读取以使用超级测试请求测试 multer

Create mock file instead of reading from disk for testing multer with supertest request

你好,先谢谢你!

我正在尝试使用 jest 和 supertest 测试多个文件大小和计数验证,但我遇到了创建假文件的问题。

想法是使用“假”文件而不是从磁盘读取真实文件

这是我目前得到的:

  const formData = new jsdom.window.FormData()

  const mockFile = {
    size: 10 * 1024 * 1024,
    type: 'text/plain'
  } as Blob

  for (let i = 0; i < 12; i++) {
    formData.append('files', mockFile)
  }

  await request(app)
    .post(`/api/file-upload/`)
    // .send(mockFile)
    .attach('files', mockFile)
    // .attach('files', mockFile)
    .expect(200)

我尝试使用 .send() 发送文件,但据我从文档中了解到,它用于发送 json 数据,因此 .attach 在这里是正确的。使用 .send() 我总是得到 req.files undefined,使用 .attach() 我得到 TypeError: source.on is not a function.

我假设问题可能出在我试图附加的“文件”上,我可能会错误地模拟它。所以问题是,如何模拟一个文件并将其与超级测试请求一起使用,而不是将真实文件存储在磁盘上并以不同方式使用附件,如 .attach('files', '/path-to-file/file.etc')

我找到了创建特定大小的模拟文件(缓冲区)的解决方案。致谢 .

.attach() 方法与发送缓冲区完美配合,这就是您如何创建特定大小的模拟缓冲区来测试您的 multer 文件上传端点:

const buffer = Buffer.alloc(1024 * 1024 * 10, '.')

所以工作示例是:

const buffer = Buffer.alloc(1024 * 1024 * 10, '.')

await request(app)
  .post(`/api/file-upload/`)
  .attach('files', buffer)
  .expect(200)