Javascript 超级测试&x2B;恢复gzipResponse文件上载

Javascript 超级测试&x2B;恢复gzipResponse文件上载,javascript,node.js,restify,supertest,superagent,Javascript,Node.js,Restify,Supertest,Superagent,我要走了 TypeError: Cannot read property 'status' of undefined 尝试使用supertest将文件上载到简单的restify服务器时,请启用gzipResponse 版本等: $ npm list | grep 'super\|mocha\|restify' ├─┬ mocha@2.4.5 ├─┬ restify@4.0.4 └─┬ supertest@1.2.0 └─┬ superagent@1.8.3 $ node -v v5.5.

我要走了

TypeError: Cannot read property 'status' of undefined
尝试使用supertest将文件上载到简单的restify服务器时,请启用
gzipResponse

版本等:

$ npm list | grep 'super\|mocha\|restify'
├─┬ mocha@2.4.5
├─┬ restify@4.0.4
└─┬ supertest@1.2.0
  └─┬ superagent@1.8.3

$ node -v
v5.5.0
服务器:

const restify = require('restify');
const server = restify.createServer();

server.use(restify.gzipResponse());

server.put('image', (req, res) => {
    res.send(200);
});

module.exports = server;
测试:

const request = require('supertest');
const server = require('./index');
const path = require('path');

describe('insertImage', function () {

    it('should send an image', done => {
        request(server)
            .put('/image')
            .attach('image', path.join(__dirname, 'pc.png'))
            .expect(200, done);
    });

});
当禁用
gzip响应
时,测试将通过,如果未附加任何文件,测试也将通过


我不确定这个问题是否与superagent/supertest有关,或者问题是否出在restify/gzip上。非常感谢您的帮助。

我认为这可能是您的项目的服务器配置问题。我认为并处理gzip响应很好

下面是我编写的一个mocha测试片段,它显示了它的工作原理。虽然这是使用express服务器,但它仍然启用了gzip压缩

var express = require('express');
var supertest = require('supertest');
var compression = require('compression');
var path = require('path');

var app = express();
app.use(compression());

app.get('/test', function(req, res) {
    res.sendStatus(200);
});

app.put('/image', function(req, res) {
    res.sendStatus(200);
});

describe('Test gzip with file upload', function(){
  it('Get a test page', function(done) {
    supertest(app)
        .get('/test')
        .expect(200)
        .end(function(err, res){
            if (err) return done(err);
            done();
        });
  });

  it('Upload an image', function(done) {
    supertest(app)
        .put('/image')
        .attach('image', path.join(__dirname, 'pc.png'))
        .expect(200)
        .end(function(err, res){
            if (err) return done(err);
            done();
        });
  });
});
虽然我没有太多地使用restify,但我只是创建了一个快速示例,它使用restify作为服务器,并且使用supertest的测试仍然通过。在上面的示例中,是否需要添加server.listen调用

var supertest = require('supertest');
var restify = require('restify');
var path = require('path');

var server = restify.createServer();
server.use(restify.gzipResponse());

server.get('/test', function(req, res) {
  res.send(200);
});
server.put('/image', function(req, res) {
  res.send(200);
});

server.listen(3000, function() {
  console.log('%s listening at %s', server.name, server.url);
});



describe('Test gzip with file upload', function(){
  it('Get a test page', function(done) {
    supertest(server)
      .get('/test')
      .expect(200)
      .end(function(err, res){
        if (err) return done(err);
        done();
      });
  });

  it('Upload an image', function(done) {
    supertest(server)
      .put('/image')
      .attach('image', path.join(__dirname, 'neo.jpg'))
      .expect(200)
      .end(function(err, res){
        if (err) return done(err);
        done();
      });
  });
});

是的,我知道这很奇怪。具体的restify+compression+supertest组合似乎确实存在问题。使用curl上传一个文件效果很好…@Edo我刚刚更新了答案,展示了一个使用restify作为API服务器的示例。我使用相同的DEP,包括节点5.5。您是否需要server.listen调用?运行测试失败,因为您似乎忘记了
it
测试中的
done
参数。我添加了done参数,并使用
服务器运行了测试。listen
调用,但上传测试仍然失败。很奇怪,真奇怪。我修复了缺少done参数的示例。不知道为什么这个例子对你仍然不起作用。