Node.js 模拟 context.req.headers.referer

Node.js mock context.req.headers.referer

我在一个项目中实施了一个重定向回到之前访问过的页面,现在必须调整一些失败的测试,因为:

Cannot read property 'headers' of undefined
TypeError: Cannot read property 'headers' of undefine

我搜索了一段时间,但没有找到好的解决方案,也没有将给定的答案转移到我当前的问题上。

函数

export const getServerSideProps: GetServerSideProps<Props> = async (ctx) => {
  ...

  const referer = ctx.req.headers.referer
  let backlink = referer

  if (!referer) {
  ...

    backlink = ...
  }

  return {
    props: {
      ...initialProps.props,
      product,
      backlink,
      ...
  }
}

测试

it('getServerSideProps should return product', async () => {
    mocked(getProductByKey).mockResolvedValueOnce(mockedProducts[0])
    const ctx = {
      query: { productKey: mockedProducts[0].key } as ParsedUrlQuery,
    }

    const result = await getServerSideProps(ctx as GetServerSidePropsContext)
    expect((result as any).props.product).toEqual(mockedProducts[0])
  })

有没有办法模拟 context.req.headers.referer?我还需要这个用于我自己尚未编写的重定向返回测试。

好吧,看来您必须向变量添加属性 ctx

错误是:Cannot read property 'headers' of undefined.

我可以看到 const referer = ctx.req.headers.referer 其中 ctx.req 未定义。

两种可能:

  • 首先:这是一个逻辑错误,reqreq.headers有时可能未定义,您应该将javascript const referer = ctx.req.headers.referer替换为const referer = ctx && ctx.req && ctx.req.headers && ctx.req.headers.referer 添加支票。

  • 其次:这是一个测试错误,reqreq.headers 将始终被定义,而您的模拟缺少它。只需替换您的规范文件:

    const ctx = {
      query: { productKey: mockedProducts[0].key } as ParsedUrlQuery,
      req: { headers: {
        referer: 'backlink', // or undefined
      } }
    }

您的错误应该已修复,如果需要,您可以为其他测试编辑 referer 值(暂时 'backlink')。