Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 带参数的Jest Express测试中间件_Node.js_Unit Testing_Express_Jestjs_Middleware - Fatal编程技术网

Node.js 带参数的Jest Express测试中间件

Node.js 带参数的Jest Express测试中间件,node.js,unit-testing,express,jestjs,middleware,Node.js,Unit Testing,Express,Jestjs,Middleware,我对node非常陌生,这是我第一次对应用程序进行单元测试。我在Jest方面做得很好,使用Jest函数伪造请求,如下所示 // Create a fake request const mockRequest = (sessionData, body) => ({ session: { data: sessionData }, body }); // Create a fake response const mockResponse = () => { const re

我对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(),
            })
        }
    }
}

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

看看这是一个专门用于模拟请求和响应的库,它很容易与单元测试/jest一起使用。我个人认为编写自己的模拟实现是不值得的。

两个月后,我意识到真正的问题是我在另一个函数中测试一个函数。 因此,首先,我将函数存储在一个变量中,以便可以将其作为常规中间件进行测试

test('Grant access if user role is allowed to', async () => {

    const isAllowToTester = userController.isAllowedTo(par1, par2);

    await isAllowToTester(req, res, next)

    expect(next).toHaveBeenCalled();

});
希望这对其他人有帮助。
这要归功于

谢谢!看起来很有用。AFAICS Nock调用端点,但我想逐个单元进行测试。上面的代码是我为了测试它而分离出来的一个中间件。嗯,我明白了,我认为sinon的存根可以帮助你做到这一点:看一看。