Javascript 测试REST API-请求主体未定义(Node.js/Express/Mocha/Supertest)

Javascript 测试REST API-请求主体未定义(Node.js/Express/Mocha/Supertest),javascript,node.js,express,mocha.js,supertest,Javascript,Node.js,Express,Mocha.js,Supertest,我正在尝试测试一个内置于节点中的RESTAPI。我已经用Postman手动测试了API,没有任何问题,但是用Mocha/Chai/Supertest编写测试时遇到了问题 当我尝试测试发送到路由时,请求主体未定义。到目前为止,在我的研究中,我似乎找不到我正在做的事情与其他人有任何有意义的区别,但由于某种原因,我试图发送的数据没有通过 以下是如何处理路线: router.route('/media') .post(RouteController.postMedia);

我正在尝试测试一个内置于节点中的RESTAPI。我已经用Postman手动测试了API,没有任何问题,但是用Mocha/Chai/Supertest编写测试时遇到了问题

当我尝试测试发送到路由时,请求主体未定义。到目前为止,在我的研究中,我似乎找不到我正在做的事情与其他人有任何有意义的区别,但由于某种原因,我试图发送的数据没有通过

以下是如何处理路线:

    router.route('/media')
        .post(RouteController.postMedia);


    RouteController.postMedia = function(req, res) {
        var media = new Media();

        console.log(req.body);

        media.title         = req.body.title;
        media.type          = req.body.type;
        media.tags          = req.body.tags;
        media.pubdate       = req.body.pubdate;
        media.editdate      = req.body.editdate;
        media.filename      = req.body.filename;
        media.extension     = req.body.extension;
        media.description   = req.body.description;

        media.save(function(err) {
            if (err)
                res.send(err);

            res.json({ message: 'File added!', data: media });
        });
    };
这是我的测试:

    var request     = require('supertest'),
        should      = require('chai').should(),
        express     = require('express'),
        mongoose    = require('mongoose'),
        app         = express();

    require('../api/routes')(app);

    var db = require('./config/db');

    describe('API Routing', function() {
        before(function(done) {
            mongoose.createConnection(db.url);
            done();
      });

        describe('Media', function () {
            it('should add new photo to database with call to POST /api/v1/media', function(done) {
                var photo = {
                    title: 'Test Photo', 
                    type: 'photo', 
                    tags: ['test', 'test2', 'asdf'], 
                    filename: 'test-photo.jpg', 
                    description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
                };

                request(app)
                    .post('/api/v1/media')
                    .send(photo)
                    .end(function(err, res) {
                        if (err) {
                            throw err
                        }

                        res.status.should.equal(200);
                        done();
                    });
            });
    });
当我运行测试时,我得到错误
TypeError:无法读取未定义的属性'title',因为req.body未定义。控制台日志(请求主体)零件确认req.body未定义

这里有两种可能性(一种确定的可能性和一种可能性):

首先,您需要告诉
supertest
您正在发送JSON类型(或任何其他类型)


第二,您是否在节点中设置了bodyParser?不确定您使用的是什么框架,但它们都需要某种形式的主体解析,无论是内置的还是外部的

我也面临同样的问题。我已通过添加以下行修复了此问题:

use(bodyParser.json())


我曾读到,如果我没有指定类型,Supertest将默认发送为
application/x-www-form-urlencoded
。我将补充这一点只是为了确定。我想你已经解决了我在bodyParser上的问题。实际上,我在index.js文件中设置了这个API,这就是为什么当我手动测试它时,API可以工作,但我没有将它包括在测试中。我有一种感觉,这将是一个这样的疏忽。谢谢你的帮助!尸体分析器的线索帮我弄明白了这一点
              request(app)
                .post('/api/v1/media')
                .type('json')
                .send(photo)