web-dev-qa-db-ja.com

Chai response.bodyは常に空です{}

私のサーバーが実際に返すものに関係なく、chaiは、response.bodyをアサートすると常にこの例外を発生させます。

キャッチされなかったAssertionError:{}が「テスト」と深く等しいことが期待されます

実際のサーバーの応答は「テスト」であり、{}ではありません: enter image description here

これが私のテストです:

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/");

何が悪いのですか?

12
Sergey

コンテンツタイプ: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/99
  2. https://github.com/visionmedia/supertest/pull/1
  3. https://github.com/visionmedia/supertest/issues/68
19
p0k8_