摩卡api测试 - PUT路线

时间:2016-03-13 22:25:40

标签: javascript mongodb mongoose mocha

我在mocha中进行了以下测试,产生了" Uncaught AssertionError:undefined ==' Ernest'。我有一种潜在的怀疑,即测试实际上找到了在测试顶部创建的歌曲实例,我相信这证明了这一点。话虽如此,我不确定如何解决它。

这是为MEAN堆栈应用程序编写的api,其中mongoose为ODM

test.js

it('can save a song', function(done) {
        Song.create({ title: 'saveASong' }, function(error, doc) {
            assert.ifError(error);
            var url = URL_ROOT + '/create/song/saveASong';
            superagent.
                put(url).
                send({
                    title: 'saveASong',
                    createdBy: 'Ernest'
                }).
                end(function(error, res) {
                    assert.ifError(error);
                    assert.equal(res.status, status.OK);
                    Song.findOne({}, function(error, song) {
                        assert.ifError(error);
                        assert.equal(song.title, 'saveASong');
                        assert.equal(song.createdBy, 'Ernest');
                        done();
                    });
                });
        });     
    });

我的路线:

//PUT (save/update) song from the create view
    api.put('/create/song/:title', wagner.invoke(function(Song) {
        return function(req, res) {
            Song.findOne({ title: req.params.title}, function(error, song) {
                if(error) {
                    return res.
                        status(status.INTERNAL_SERVER_ERROR).
                        json({ error: error.toString() });
                }
                song.save(function(error, song) {
                    if(error) {
                        return res.
                            status(status.INTERNAL_SERVER_ERROR).
                            json({ error: error.toString() });
                    }
                    return res.json({ song: song });
                });
            });         
        };
    }));

更新:我在" end"之后输入了console.log(res.body),它没有包含" createdBy:Ernest" k / v对。所以我试图改变被发送到另一个k / v对的对象(当然是来自模式),但仍然没有任何东西。如果我发表评论,那么我就不会收到任何错误:断言等等......'欧内斯特'"线。

我最新版的PUT路线:

api.put('/create/song/:title', wagner.invoke(function(Song) {
        return function(req, res) {
            Song.findOneAndUpdate({ title: req.params.title}, req.body ,{ new: true }, function(error, song) {

                if(error) {
                    return res.
                    status(status.INTERNAL_SERVER_ERROR).
                    json({ error: error.toString() });
                }

                return res.json({ song: song });
                });
        };          
    }));

1 个答案:

答案 0 :(得分:1)

以下api路线

api.put('/create/song/:title', wagner.invoke(function(Song) {
        return function(req, res) {
            Song.findOneAndUpdate({ title: req.params.title}, req.body ,{ new: true }, function(error, song) {

                if(error) {
                    return res.
                    status(status.INTERNAL_SERVER_ERROR).
                    json({ error: error.toString() });
                }

                return res.json({ song: song });
                });
        };          
    }));

通过以下mocha测试

it('can save a song', function(done) {
        Song.create({ title: 'saveASong' }, function(error, doc) {
            assert.ifError(error);
            var url = URL_ROOT + '/create/song/saveASong';
            superagent.
                put(url).
                send({
                    sections:[{ name: 'intro', timeSig: 140 }]
                }).
                end(function(error, res) {
                    assert.ifError(error);
                    assert.equal(res.status, status.OK);
                    console.log(res.body);
                    Song.findOne({}, function(error, song) {
                        assert.ifError(error);
                        assert.equal(song.title, 'saveASong');
                        //console.log(song);
                        assert.equal(song.sections[0].name, 'intro');
                        done();
                    });
                });
        });     
    });