【问题标题】:Chai response.body is always empty {}Chai response.body 始终为空{}
【发布时间】:2017-04-10 10:23:52
【问题描述】:

无论我的服务器实际返回什么,当我断言 response.body 时,Chai 总是给我这个异常:

未捕获的 AssertionError:预期 {} 与“测试”完全相等

即使实际的服务器响应是“测试”,而不是 {}:

这是我的测试:

const chai = require('chai');
const chaiHttp = require('chai-http');
const server = require('./test-server');
const should = chai.should();    
chai.use(chaiHttp);

describe('GET /test', () => {
  it('it should give test result', (done) => {
    chai.request(server)
        .get('/test')
        .end((err, res) => {
            console.log(err); // outputs null
            console.log(res); // outputs normal-looking response
            res.body.should.be.eql('test');
            done();
        });
  });
});

这是我的服务器(test-server.js):

const http = require('http');
const server = http.createServer(function (request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.end('test');
});

module.exports = server;

server.listen(process.env.PORT || 8000);
console.log("Server running at http://localhost:8000/");

我做错了什么?

【问题讨论】:

  • 您的响应正文返回对象,并且您将其与字符串相等
  • @p0k8_ 那我该怎么办?如何断言来自服务器的响应? (这是字符串,不是对象)
  • 不确定,但您可能需要 res.text.should.be.eql('test');

标签: node.js mocha.js chai


【解决方案1】:

内容类型:application/json

res.body 的填充取决于 Content-Type 标头

test-server.js

const http = require('http');
const server = http.createServer(function (request, response) {
    response.writeHead(200, {"Content-Type": "application/json"});

    var b = JSON.stringify({
      name: 'asad',
      class: 'paewe'
    });

    response.end(b);
});

module.exports = server;

server.listen(process.env.PORT || 8000);
console.log("Server running at http://localhost:8000/");

res.body 将包含 Parsed 对象

test.js

const chai = require('chai');
const chaiHttp = require('chai-http');
const server = require('./test-server');
const should = chai.should();
chai.use(chaiHttp);

describe('GET /test', () => {
    it('it should give test result', (done) => {
        chai.request(server)
            .get('/test')
            .end((err, res) => {
                console.log(err); // outputs null
                console.log(res); // outputs normal-looking response
                console.log(res.body) // { name: 'asad', class: 'paewe' }

                var checkObj = {
                    name: 'asad',
                    class: 'paewe'
                }
                res.body.should.be.eql(checkObj); // passes test
                done();
            });
    });
});

----------------------------------------------- -------------------------------------------------- --------

内容类型:text/plain

如果 Content-Type 标头为 text/plain,则响应正文不会被解析为任何内容,但 res.text 会将数据包含为字符串

test-server.js

const http = require('http');
const server = http.createServer(function (request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.end('test');
});

module.exports = server;

server.listen(process.env.PORT || 8000);
console.log("Server running at http://localhost:8000/");

test.js

const chai = require('chai');
const chaiHttp = require('chai-http');
const server = require('./test-server');
const should = chai.should();    
chai.use(chaiHttp);

describe('GET /test', () => {
  it('it should give test result', (done) => {
    chai.request(server)
        .get('/test')
        .end((err, res) => {
            console.log(err); // outputs null
            console.log(res); // outputs normal-looking response
            console.log(res.body) // {}
            res.text.should.be.eql('test'); // passes test
            done();
        });
  });
});

一些参考

  1. https://github.com/visionmedia/superagent/issues/990
  2. https://github.com/visionmedia/supertest/pull/10
  3. https://github.com/visionmedia/supertest/issues/68

【讨论】:

  • 谢谢!有用。当内容类型为“应用程序/javascript”时,您是否知道该怎么做?那我该如何测试呢? res.text 和 res.body 都不包含服务器输出
  • 我问了一个单独的问题:stackoverflow.com/questions/43324004/…也许你可以回答它?提前致谢!
  • 当服务器以 'Content-Type': 'text/xml' 响应时,body 也是空的并且 res.text 包含 xml 作为字符串。 - 这真的不是聪明的设计。
猜你喜欢
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 2017-07-31
  • 2019-07-18
  • 2019-08-18
  • 2011-12-29
  • 2019-07-02
  • 2019-05-04
相关资源
最近更新 更多