首页 > 解决方案 > Node.js 模拟 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?我还需要它来进行我自己的尚未编写的重定向测试。

标签: node.jsreactjstestingjestjs

解决方案


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

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

我可以看到const referer = ctx.req.headers.referer未定义ctx.req的位置。

两种可能性:

  • 首先:这是一个逻辑错误,req或者req.headers有时可能未定义,您应该替换您的 javascriptconst referer = ctx.req.headers.refererconst referer = ctx && ctx.req && ctx.req.headers && ctx.req.headers.referer添加检查。

  • 第二:这是一个测试错误,req并且req.headers总是被定义并且你的模拟丢失了它。只需在您的规范文件中替换:

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

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


推荐阅读