【问题标题】:Jest Express testing middleware with argumentsJest Express 使用参数测试中间件
【发布时间】:2020-05-17 00:06:41
【问题描述】:

我对 node 很陌生,这是我第一次对应用程序进行单元测试。我在 Jest 使用 Jest 函数伪造请求方面做得很好,如下所示

// Create a fake request
 const mockRequest = (sessionData, body) => ({
  session: { data: sessionData },
  body
});

// Create a fake response
 const mockResponse = () => {
  const res = {};
  res.status = jest.fn().mockReturnValue(res);
  res.json = jest.fn().mockReturnValue(res);
  return res;
};

const mockNext = () => {
  const next = jest.fn();
  return next;
};

所以我可以像下面这样使用它们

doSomething(req, res, next);
expect(res.status).toHaveBeenCalledWith(201);
//or
expect(next).toHaveBeenCalled();

这对所有情况都足够了,直到我发现我的授权中间件包含几个参数,所以我不能传递假的 res 和 req,如下所示

exports.isAllowedTo = (par1, par2) => {
    return async (req, res, next) => {
        try {
            //
            // Grant logic here that needs par1 and par2
            //

            if(granted)
                next();
            else
                return res.status(401).json({
                    error: "You don't have enough permission to perform this action"
                });

        } catch (err) {
            res.status(406).json({
                error: err.toString(),
            })
        }
    }
}

如果我使用模拟 req、res 和 next 测试 isAllowTo(req, res, next),那么我将缺少该函数所需的 2 个参数。实际上,当我这样做时,甚至没有调用函数isAllowTo()。我不知道该怎么处理。有什么建议或方法吗?

【问题讨论】:

    标签: node.js unit-testing express jestjs middleware


    【解决方案1】:

    查看https://github.com/nock/nock,它是一个专门用于模拟请求和响应的库,它非常易于与单元测试/玩笑一起使用。我个人认为编写自己的模拟实现不值得。

    【讨论】:

    • 谢谢!看起来非常有用的模拟。 AFAICS Nock 调用端点,但我想逐单元测试。上面这段代码是我为了测试而隔离的一个中间件。
    • 嗯,我明白了,我认为 sinon 的存根可以帮助您做到这一点:sinonjs.org/releases/latest/stubs 看看。
    【解决方案2】:

    两个月后,我意识到真正的问题是我正在另一个函数内部测试一个函数。 所以首先我将函数存储在一个变量中,这样我就可以将它作为一个普通的中间件进行测试。

    test('Grant access if user role is allowed to', async () => {
    
        const isAllowToTester = userController.isAllowedTo(par1, par2);
    
        await isAllowToTester(req, res, next)
    
        expect(next).toHaveBeenCalled();
    
    });
    

    希望这对其他人有所帮助。 感谢post

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-02
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 2021-08-15
      • 2021-04-29
      • 2020-09-25
      相关资源
      最近更新 更多