NodeJS 如何使用Jest测试认证中间件

5lhxktic  于 2023-06-29  发布在  Node.js
关注(0)|答案(2)|浏览(122)

我正在学习nodejs,大部分情况下进展顺利。我正试图学习如何在测试中用jest进行嘲笑。我看了很多教程,但我似乎不能让我的头周围。
我有一个中间件,用于受保护的路由…

import jwt from 'jsonwebtoken';

export default function (req, res, next) {
  const token = req.header('x_auth-token');
  if (!token) return res.status(401).json({ message: 'Access denied' });
  try {
    const verified = jwt.verify(token, process.env.TOKEN_SECRET);
    req.user = verified;
    next();
  } catch (err) {
    return res.status(400).send('Invalid Token');
  }
}

从我所读到的,我认为我应该采取的方法是这样的…

import verifyToken from '../middleware/verifyToken';

test('verifyToken', () => {
  expect.assertions(1);
  const res = {};
  const req = {};
  const next = (err) => expect(err).toBeFalsy();
  verifyToken(req, res, next);
});

然而,这显然行不通。
那么,如何用令牌模拟请求头呢?

zpjtge22

zpjtge221#

所以如果我们完全忘记真实的世界中的req和res是什么,显然它们是请求和响应,但现在让我们忘记它。
在真实的代码中,有token = req.header("x_auth-token")
因此,在我们的测试代码中,我们需要在req对象中有一些东西,当使用这些参数调用时,它会返回您想要的内容。
所以我会说。

const req = {
    header: jest.fn(() => 'myAuthToken')
}

jest.fn()创建了一个mock函数,当它被调用时,它总是返回字符串myAuthToken
然后,我们可以通过添加以下内容来检查是否使用正确的参数调用了头函数

expect(req.header).toHaveBeenCalledWith("x_auth-token")

您还需要模拟jwt.verify,因为您没有测试jwt.verify的工作情况,因为它将在自己的测试中进行。你要确保你正确地使用了那个的响应
为此,请查看this stack overflow question
最后,我将next设置为一个模拟函数

mockNext = jest.fn()

那么我们可以在测试中说

expect(mockNext).toHaveBeenCalled()
798qvoo8

798qvoo82#

So I was had trouble麻烦understandin how to mock模拟functions函数.我根据Ollie Pugh的回答做了一堆谷歌搜索,这是我得到的。

import jwt from 'jsonwebtoken';
import verifyToken from '../middleware/verifyToken';
import { uIds } from './testdata/userTestData';

describe('verifyToken tests', () => {
  const { uid1 } = uIds;
  it('Should pass the userId to the request object if token is verified', () => {
    const res = {};
    const req = {
      header: jest.fn(() => 'myAuthToken'),
    };
    const next = jest.fn();

    const verify = jest
      .spyOn(jwt, 'verify')
      .mockReturnValueOnce({ userId: String(uid1) });
    verifyToken(req, res, next);

    expect(req.header).toHaveBeenCalledWith('x_auth-token');
    expect(req.user).toEqual({ userId: String(uid1) });
    expect(next).toHaveBeenCalled();
  });

  it('Should deny access if token is not present in header', () => {
    const res = {
      json(msg) {
        expect(msg).toEqual({ message: 'Access denied' });
      },
      status(responseStatus) {
        expect(responseStatus).toEqual(401);
        return this;
      },
    };
    const req = {
      header: jest.fn(),
    };
    const next = jest.fn();
    verifyToken(req, res, next);
    expect(req.header).toHaveBeenCalledWith('x_auth-token');
    expect(req.user).not.toEqual({ userId: String(uid1) });
  });

  it('Should deny access if token is invalid', () => {
    const res = {
      send(text) {
        expect(text).toEqual('Invalid Token');
      },
      status(responseStatus) {
        expect(responseStatus).toEqual(400);
        return this;
      },
    };
    const req = {
      header: jest.fn(() => 123),
    };
    const next = jest.fn();

    const verify = jest.fn();

    verifyToken(req, res, next);

    expect(req.header).toHaveBeenCalledWith('x_auth-token');
    expect(req.user).not.toEqual({ userId: String(uid1) });
  });
});

这通过了测试。但是我不确定测试的有效性。

相关问题