0

我正忙于为我编写的现有 nodejs api 构建功能测试。我正在使用 mocha 和 expect.js。

一个失败的测试是当我想对 url 参数的存在进行否定测试时。如果参数丢失,我想要的是向服务的使用者发送一条消息。

目前我的阳性测试有效:

var request = require('request');

it('get a specific user from the api', function (done) {
    request.get('http://localhost:8080/api/v1/user/123', function (error, response, body) { ... });
});

但是,以下内容不起作用,我得到的只是超时:

it('should return a 400 message if UserId is not supplied stating that "UserId expected"', function(done) {
    request.get('http://localhost:8080/api/v1/user/', function (error, response, body) { 
        if (!error && response.statusCode == 400) {
            expect(body).to.be.equal('UserId expected');
            done();
        }
    });
});

上述两个测试都在测试这个端点:

app.get('/api/v1/user/:userid', function (req, res) {
    if(!req.params.userid) {
        return res.status(400).json('UserId expected');
    }

    ... get the user and return it with status 200 ...
});

但是,如前所述,第一次测试成功,而第二次测试超时。

更新 1:此外,我得到以下输出:

GET /api/v1/user/123 200 2.905 ms - 274
GET /api/v1/user/ - - ms - -

更新2:因此添加以下代码可以解决问题,但并不能真正解决问题:

app.get('/api/v1/user', function (req, res) {
    return res.status(400).json('UserId expected');
});

显然,我不希望有一段相当多余的代码。我很困惑为什么我不能进入 'api/v1/user/:userid' 端点并且只是测试那里是否:userid存在?就好像 nodejs 要求存在:userid,否则端点不存在。这个对吗?

我错过了什么?

4

2 回答 2

0

根据mocha 文档,必须始终调用 done 回调,即使出现错误也是如此。事实上,它接受一个错误。所以我认为你必须重写你的代码:

it('should return a 400 message if UserId is not supplied stating that "UserId expected"', function(done) {
    request.get('http://localhost:8080/api/v1/user/', function (error, response, body) {
        if (error) return done(error);
        if (response.statusCode != 400) return done(new Error("Not 400"));

        expect(body).to.be.equal('UserId expected');
        done();
    });
});
于 2016-01-27T21:29:30.983 回答
0

所以我做了一些更多的调查,并在这里问了关于这个问题的另一个问题。

最后的问题是我没有完全理解 express 框架。基本上我在问题的更新 2 中提到的是我需要遵循的路线并指定一条不需要参数的路线,但在这种情况下返回我期望的错误消息。

这种方法的问题是,在某些情况下,可能需要在 ur.xml 中使用多个参数。但是,这将意味着要满足未定义参数的每种情况的排列会有点令人生畏。(2 个参数表示 4 个组合,3 个表示 9 个等。)这将是维护的噩梦!

从现在开始,我的方法将是遵循一种方法,即我想传递给服务器的任何信息都将通过每个请求的正文中的 JSON 发送。这将使我能够坚持一条路线。

于 2016-02-01T08:47:02.467 回答