用竞争条件进行快速中间件测试

时间:2015-11-11 06:43:26

标签: node.js testing express bdd

我在Express中使用promise(使用Q库)测试中间件时遇到了麻烦。

这是一个类似我案例的例子。

var httpMocks = require('node-mocks-http');
test('should return 404 status', function (done) {
  var req = httpMocks.createRequest(),
  var res = httpMocks.createResponse();

  myMiddleware(req, res);

  expect(req.statusCode).to.equal(404);
});

让我们说,myMiddleware拨打另一个模块using promise来调用next()上的resolve或{{1}上的res.status(404).send() }}

我嘲笑模块用于测试目的。

我怎样才能抓住reject myMiddleware的{​​{1}}结尾,但是没有返回next()?

干杯!

1 个答案:

答案 0 :(得分:0)

您将不得不将myMiddleware更改为返回承诺或进行回调。

你可以这样做:

// myMiddleware now makes callback with potential error
function myMiddleware(req, res, callback) {
    async.map(..., function(err, results){
        callback(err);
    });
}

然后在测试中,您可以等待回调测试值:

test('should return 404 status', function (done) {
    var req = httpMocks.createRequest(),
    var res = httpMocks.createResponse();

    myMiddleware(req, res, function(error) {
        if(error) {
            // Handle error for tests
        }
        // Test your values now
        expect(req.statusCode).to.equal(404);

        // All done
        done();
    });
});

在此示例中,来自myMiddleware的回调仅返回错误,因为显然您并不关心其他任何事情。在您的情况下,我们主要只是使用回调作为测试值的触发器。