您如何在一个简单的模拟函数中将res对象传递到回调函数中?

时间:2019-04-23 22:25:59

标签: javascript node.js express callback jestjs

我正在用Node.js开发一个Web服务器,目前正在尝试通过玩笑测试覆盖所有分支。我有一个功能,登出,它接受来自req的req和res对象。我需要在if语句中进行测试。

// app.js
function logout(req, res) {

    // console.log(req.session.destroy.toString());
    req.session.destroy(function (err){

        if (err){

            console.error(err);
            res.sendStatus(500);

        }
        console.log('Logged out');
        res.redirect('/');

    });

}
// app.test.js
    let res = {sendStatus: jest.fn((inp) => inp)};
    let req = {
        session: { destroy: jest.fn((callback) => {

            callback('TEST_ERROR');

        })}
    };

    test('Test /logout error', async () => {

        await logout(req, null);
        expect(req.session.destroy.mock.calls.length).toEqual(1);

    });

我已经搜索了类似的答案,唯一可以发现的话题是this,它使我可以进入if语句,但现在抛出错误:TypeError: Cannot read property 'sendStatus' of null。 无论如何,我可以允许回调函数访问我在app.test.js中定义的资源吗?任何对正确方向的帮助或指导都将受到赞赏。

已解决

正如plumthedev正确指出的那样,在我的app.test.js中,当我调用loguout时,我传递的是我错过的null。一旦将其更改为res,它就解决了我的问题。

// app.test.js
test('Test /logout error', async () => {

    await logout(req, res);
    expect(req.session.destroy.mock.calls.length).toEqual(1);

});

2 个答案:

答案 0 :(得分:1)

test() app.test.js 中,您将 res 参数传递为 null 。并且您收到错误TypeError: Cannot read property 'sendStatus' of null,这通常是因为您传递了 null 。此回调是正确的,但调用错误。像传递 req 一样尝试传递 res

请务必阅读以下内容: 回调函数MDN(理论):https://developer.mozilla.org/en-US/docs/Glossary/Callback_function

回调函数(FelDev on Medium-实践和理论):https://medium.com/javascript-in-plain-english/callbacks-in-node-js-how-why-when-ac293f0403ca

问候,李子!

答案 1 :(得分:0)

最简单的回调示例如下:link Yu可以轻松传递一些道具:)