单元测试异步表达中间件

时间:2019-01-27 19:55:29

标签: javascript node.js express asynchronous testing

我有以下异步中间件,该中间件使用多个try-catches来检查某些http调用的响应。我希望对该中间件进行单元测试,但是在模拟“下一个”回调时遇到了困难。当我像这样包裹它时:

it('should test for auth', () => {
    logon(req, res, function() {
        expect(res.locals).toBe(true)
    })
})

它似乎实际上并没有在运行该函数并在之后运行expect。关于如何模拟requestresponsenext对象以便可以测试最终值(res.locals)的任何想法?谢谢。

async function logon(req, res, next) {

if (!req.query.isAuth)
    req.locals.auth = false;
    next()
}

try {
    const getData = await http.get(/logon);
    if (getData.status == 200) {
        res.locals.auth = true;
    } else {
        res.locals.auth = false;
        try {
            const secondCall = http.get(/logon2);
            if (secondCall.data.bob) {
                return res.redirect(/home);
            }
        } catch(e) {console.error(3)}
    }
} catch(e) {console.error(e)}
next();
}

1 个答案:

答案 0 :(得分:0)

您可以使用最少的api将req,res和next作为空对象(存根)进行创建,并在函数运行后检查它们的更改。对于存根/ mo子/间谍,您还可以使用现成的,并带有sinon.js https://sinonjs.org或jest