【问题标题】:Using mocha/chai to ensure REST API serves up a file?使用 mocha/chai 确保 REST API 提供文件?
【发布时间】:2017-03-23 20:39:17
【问题描述】:

我想验证对我的 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                
        });
});     

我基本上想做以下测试:

  • 确保响应是文件
  • 确保文件内容有效(校验和测试)

任何帮助将不胜感激。

【问题讨论】:

    标签: node.js rest express integration-testing chai


    【解决方案1】:

    提供的解决方案基于进一步的实验和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 中,可能会有所改进

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 2021-05-11
      • 2020-10-11
      相关资源
      最近更新 更多