节点JS测试 - 模拟文件上传

时间:2017-08-17 08:45:57

标签: node.js unit-testing

我正在使用node-mocks-http来测试我的API,我在模拟文件上传时遇到了问题。这是我的尝试:

var response = buildResponse()
var request  = http_mocks.createRequest({
  method: 'POST',
  url    : '/test',
  headers: {
    'Content-Type'     : 'multipart/form-data;',
    'Transfer-Encoding': 'identity'
  },
  files: {
    project: fs.createReadStream('tests/fixtures/test.json')
  }
})

response.on('end', function() {
  response._getData().should.equal('finished');
  done();
})

app.handle(request, response)

知道为什么这不会导致正确的文件上传?至少,express-fileupload模块没有将其视为一个。

非常感谢。

1 个答案:

答案 0 :(得分:0)

我不是直接解决node-mocks-http,而是使用supertest模拟Node.js测试中的文件上传,以实现相同的目标。

就我而言,我的Express中间件使用Formidable来解析表单数据,尤其是文件上传; supertestFormidable的搭配非常好。

下面是一段代码示例。它测试了我的Express中间件,该中间件将文件上传到Minio S3存储桶。

it('posts a file', done => {
  const app = express()
  app.post(
    '/api/upload',
    minioMiddleware({ op: expressMinio.Ops.post }),
    (req, res) => {
      if (req.minio.error) {
        res.status(400).json({ error: req.minio.error })
      } else {
        res.send(`${req.minio.post.filename}`)
      }
    }
  )

  request(app)
    .post('/api/upload')
    .attach('file', '/tmp/a-file-to-upload.txt')
    .expect(200, done)
})
在此测试中,

supertest将上传文件/tmp/a-file-to-upload.txt,中间件将依次将文件放入Minio S3。对我来说很好。