Nodejs - Mocha,Chai:如何通过调用next来测试将控制传递给多个中间件函数的端点

时间:2017-01-18 20:30:21

标签: node.js unit-testing express mocha chai

我有一个终点,通过调用next()将控制传递给多个中间件函数,例如:

var express = require('express');
var router = express.Router();

router.post('/', isRequestValid, saveUser, respond)

function isRequestValid(req, res, next) {
    // Do some stuff
    next();
}

function saveUser(req, res, next) {
    // Do more stuff
    next();
}

function respond(req, res, next) {
    // Do more stuff and send response
    res.sendStatus(200);
}

我可以使用Chai和Mocha测试终点/,例如:

describe("Testing / end point", () => {
    it("Does it behave as expected", (done) => {
        chai.request(server)
            .post("/")
            .send(someData)
            .end((error, response) => {
                // Assertions
            });
    })
})

我有点混淆了如何使用Chai和Mocha测试各个中间件函数isRequestValidsaveUser

1 个答案:

答案 0 :(得分:0)

如果你想测试你的中间件,你应该考虑将它们作为需求(通过导出它们),然后用模拟的请求和响应对象测试每个中间件。

假设这是您的 index.js 文件:

var express = require('express');
var router = express.Router();

router.post('/', isRequestValid, saveUser, respond)

function isRequestValid(req, res, next) {
    // Do some stuff
    next();
}

function saveUser(req, res, next) {
    // Do more stuff
    next();
}

function respond(req, res, next) {
    // Do more stuff and send response
    res.sendStatus(200);
}
module.exports.isRequestValid = isRequestValid;

然后:

const isRequestValid = require('./index.js').isRequestValid;
describe("Testing isRequestValid()", () => {
    it("Does it behave as expected", (done) => {
        const mockReq = {
            body: {<some data>}
        };
        const mockRes = {};
        isRequestValid(mockReq, mockRes, done);
    })
})

这可能无法正常工作,但我认为这可能是您的一个解决方案。

编辑:看看这些项目是否可以轻松地模拟快速请求和响应