使用 mocha/chai 确保 REST API 提供文件?
Using mocha/chai to ensure REST API serves up a file?
我想验证对我的 REST API 的一个端点的调用是否正在提供一个文件,但我不确定如何去做,而且我没有看到任何这方面的例子?我确实看过 documentation,但这对我帮助不大。
服务器端代码本质上是(在 Express 中):
handleRetrieveContent(req, res, next) {
const filepaht = '...';
res.sendFile(filepath)
}
和测试用例:
it('Should get a file', (done) => {
chai.request(url)
.get('/api/exercise/1?token=' + token)
.end(function(err, res) {
if (err) { done(err); }
res.should.have.status(200);
// Not sure what the test here should be?
res.should.be.json;
// TODO get access to saved file and do tests on it
});
});
我基本上想做以下测试:
- 确保响应是一个文件
- 确保文件内容有效(校验和测试)
如有任何帮助,我们将不胜感激。
所提供的解决方案基于进一步的实验和 https://github.com/chaijs/chai-http/issues/126 中提供的答案 - 注意代码假定 ES6(使用 Node 6.7.0 测试)。
const chai = require('chai');
const chaiHttp = require('chai-http');
const md5 = require('md5');
const expect = chai.expect;
const binaryParser = function (res, cb) {
res.setEncoding('binary');
res.data = '';
res.on("data", function (chunk) {
res.data += chunk;
});
res.on('end', function () {
cb(null, new Buffer(res.data, 'binary'));
});
};
it('Should get a file', (done) => {
chai.request(url)
.get('/api/exercise/1?token=' + token)
.buffer()
.parse(binaryParser)
.end(function(err, res) {
if (err) { done(err); }
res.should.have.status(200);
// Check the headers for type and size
res.should.have.header('content-type');
res.header['content-type'].should.be.equal('application/pdf');
res.should.have.header('content-length');
const size = fs.statSync(filepath).size.toString();
res.header['content-length'].should.be.equal(size);
// verify checksum
expect(md5(res.body)).to.equal('fa7d7e650b2cec68f302b31ba28235d8');
});
});
编辑:大部分内容在 Read response output buffer/stream with supertest/superagent on node.js server 中,可能有改进
我想验证对我的 REST API 的一个端点的调用是否正在提供一个文件,但我不确定如何去做,而且我没有看到任何这方面的例子?我确实看过 documentation,但这对我帮助不大。
服务器端代码本质上是(在 Express 中):
handleRetrieveContent(req, res, next) {
const filepaht = '...';
res.sendFile(filepath)
}
和测试用例:
it('Should get a file', (done) => {
chai.request(url)
.get('/api/exercise/1?token=' + token)
.end(function(err, res) {
if (err) { done(err); }
res.should.have.status(200);
// Not sure what the test here should be?
res.should.be.json;
// TODO get access to saved file and do tests on it
});
});
我基本上想做以下测试:
- 确保响应是一个文件
- 确保文件内容有效(校验和测试)
如有任何帮助,我们将不胜感激。
所提供的解决方案基于进一步的实验和 https://github.com/chaijs/chai-http/issues/126 中提供的答案 - 注意代码假定 ES6(使用 Node 6.7.0 测试)。
const chai = require('chai');
const chaiHttp = require('chai-http');
const md5 = require('md5');
const expect = chai.expect;
const binaryParser = function (res, cb) {
res.setEncoding('binary');
res.data = '';
res.on("data", function (chunk) {
res.data += chunk;
});
res.on('end', function () {
cb(null, new Buffer(res.data, 'binary'));
});
};
it('Should get a file', (done) => {
chai.request(url)
.get('/api/exercise/1?token=' + token)
.buffer()
.parse(binaryParser)
.end(function(err, res) {
if (err) { done(err); }
res.should.have.status(200);
// Check the headers for type and size
res.should.have.header('content-type');
res.header['content-type'].should.be.equal('application/pdf');
res.should.have.header('content-length');
const size = fs.statSync(filepath).size.toString();
res.header['content-length'].should.be.equal(size);
// verify checksum
expect(md5(res.body)).to.equal('fa7d7e650b2cec68f302b31ba28235d8');
});
});
编辑:大部分内容在 Read response output buffer/stream with supertest/superagent on node.js server 中,可能有改进