测试在NextJs、React和Jest中使用`context`的iron-session `withIronSessionSsr`

lndjwyie  于 2023-06-22  发布在  React
关注(0)|答案(1)|浏览(142)

所以我有下面这个NextJs实用程序文件函数,它返回一个导入的函数。然后,导入的函数接受一个使用上下文的处理程序作为参数。

import { ironSessionUtil } from './anotherUtil'

const checker = () =>
  ironSessionUtil(({ req }) => {
    const { user } = req.session
    if (!user) {
      return {
        redirect: { destination: '/welcome', permanent: false }
      }
    }

    return { props: { details: user.details } }
  })

export default checker

到目前为止,我只尝试调用该方法,但它返回Async Function

it('should return props', () => {
  const result = checker()
  console.log('result >> ', result)
})

这将返回:
[AsyncFunction: nextGetServerSidePropsHandlerWrappedWithIronSession]
我一直在网上搜索如何测试这个。你会建议重构以使其更可测试吗?或者你知道这是如何在开玩笑吗?

jvlzgdj9

jvlzgdj91#

我假设你通常会问如何测试带有-iron-session的API路由,因为这是我正在做的,我找到了你的问题。我发现了这个resource,它给了我一个可能的解决方案的线索。

    • 以下是我所做的:**对于上下文,我使用NextJS页面路由器作为API路由,并使用withIronSessionApiRoute() Package 所有经过身份验证的路由

我在代码中所做的主要重构是从一个单独的文件中导出实际的API路由函数。我把这个文件保存在我的/lib文件夹中,以防止它进入API路由。

//lib/authApiRoute.js
export async function authRoute(req,res) {
    //put your code for testing here.  I have an example of checking credentials.
    if (!req.session || !req.session.user) {
        res.send({ message: 'not authorized' }, { status: 401 });
        return;
    }
    //and so on...
}

然后,我在实际的API路由中导入了该函数,并在此处使用iron会话进行 Package 。Iron会话不需要测试,但在这里执行集成测试是很重要的。

//pages/api/authRoute.js
import { withIronSessionApiRoute } from 'iron-session/next';
import { sessionOptions } from 'PATH_TO_SESSION_OPTIONS';
import { authRoute } from 'lib/authApiRoute';

export default withIronSessionApiRoute(authRoute,sessionOptions);

现在,通过Jest测试,我可以使用像node-mocks-http这样的包来创建我想要响应的会话信息,并测试代码以查看它如何响应。

import { createMocks } from 'node-mocks-http';
import { authRoute } from '../../../lib/authApiRoute';
import { jest } from '@jest/globals';

describe("Auth request", () => {
    it('should block unauthorized requests.', async () => {
        var {req, res} = createMocks({
            method: 'GET',
            url: '/api/user/getStudents'
        }, {});
        await getStudents(req,res);
        expect(res.statusCode).toBe(401);
    });
    it('should block requests with session, but no user.', async () => {
        var {req, res} = createMocks({
            method: 'GET',
            url: '/api/user/getStudents',
            session: {}
        }, {});
        await getStudents(req,res);
        expect(res.statusCode).toBe(401);
    });
    it('should allow auth requests with a user', async () => {
        var {req, res} = createMocks({
            method: 'GET',
            url: '/api/user/getStudents',
            session: {user: { isLoggedIn:true } }
        }, {});
        await getStudents(req,res);
        expect(res.statusCode).toBe(200);
    });
});

展望未来,我知道我将设计一种方法来测试集成设置中的api路由,但在身份验证后分离路由对我来说是一个巨大的胜利,因为我现在可以在Jest中自动完成所有这些工作。

相关问题