CORS 错误 - 错误:禁止跨源 http://localhost - 仅在 ReactJS/Jest 测试中

Posted

技术标签:

【中文标题】CORS 错误 - 错误:禁止跨源 http://localhost - 仅在 ReactJS/Jest 测试中【英文标题】:CORS error - Error: Cross origin http://localhost forbidden - in ReactJS/Jest test only 【发布时间】:2020-03-06 05:04:15 【问题描述】:

我遇到了一个问题,我向外部 API 发出的请求在执行时工作正常,但是在运行 Jest/Enzyme 测试时它给了我一个 CORS 错误。有问题的函数是使用 API 中的 JsonRpc 实现,并使用 node-fetch 中的 fetch。不确定是否有我可以在某处应用的 CORS 设置?

我在 Jest/Enzyme 测试框架中尝试了多种异步等待,但仍然遇到问题。

test("it should do something", done => 
    const component = shallow(<CustomComponent />)
    component.instance().customAsyncFunction( result => 
      expect(result.length).toEqual(5)
      done()
    )
    // return component.instance().customAsyncFunction().then(data => 
    //   expect(data.length).toEqual(5)
    // )
  )

我尝试了上述方法和其他一些方法(如 setTimeout 和等待它)并得到了 CORS 错误。

我得到的结果是:

 console.error
 node_modules/jest-environment-jsdom/node_modules/jsdom/lib/jsdom/virtual-console.js:29
   Error: Cross origin http://localhost forbidden
       at dispatchError (...\node_modules\jest-environment-jsdom\node_modules\jsdom\lib\jsdom\living\xhr-utils.js:65:19)
       at Request.client.on.res (...\node_modules\jest-environment-jsdom\node_modules\jsdom\lib\jsdom\living\xmlhttprequest.js:679:38)
       at Request.emit (events.js:198:13)
       at Request.onRequestResponse (...\node_modules\request\request.js:1066:10)
       at ClientRequest.emit (events.js:203:15)
       at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:556:21)
       at HTTPParser.parserOnHeadersComplete (_http_common.js:109:17)
       at TLSSocket.socketOnData (_http_client.js:442:20) undefined

有什么想法吗?

【问题讨论】:

你在浏览器中运行测试吗?因为 CORS 检查对于浏览器来说是典型的,但我相信对于 NodeJS 来说它不是预期的 【参考方案1】:

通过设置 testURL 选项,这是您在 jest 配置中想要的有效 URL 将解决此问题。

【讨论】:

【参考方案2】:

假设您确实想在测试期间调用真正的 API 而不仅仅是模拟它,您需要确保服务器发送适当的“访问控制允许来源”标头(显然是执行的确切机制这取决于您的服务器平台)

【讨论】:

【参考方案3】:

Jest 允许您设置设置脚本文件。该文件在其他所有内容之前都是必需的,它使您有机会修改运行测试的环境。这样,您可以在加载 axios 之前取消设置 XMLHttpRequest,并在提升导入后评估适配器类型。 链接:https://facebook.github.io/jest/docs/configuration.html#setuptestframeworkscriptfile-string

在 package.json 中


  ...,
  "jest": 
    ...,
    "setupTestFrameworkScriptFile": "./__tests__/setup.js",
    ...
  ,
  ...

__tests__/setup.js

global.XMLHttpRequest = undefined;

【讨论】:

我实际上是在使用 XMLHttpRequest。除此之外我还能做什么?【参考方案4】:

1) 您可能正在寻找的是代替模拟 promise 或使用 jest.mock() 运行的任何函数,然后断言该模拟已被调用(使用正确的参数) Jest 测试是不应该真正与您的 API 对话的单元测试

2) 在测试模式下,您的 env var 很可能有一些东西,process.env.NODE_ENV 在开玩笑期间设置为“test”,这可能会改变某些东西,或者可能是您自己的自定义配置 env var 之一

【讨论】:

以上是关于CORS 错误 - 错误:禁止跨源 http://localhost - 仅在 ReactJS/Jest 测试中的主要内容,如果未能解决你的问题,请参考以下文章

使用 python flask-restful 和消费 AngularJS(使用 $http)时出现 CORS(跨源...)错误

阻止跨源请求

Fusion Tables 不支持 CORS(跨源资源共享)?

错误:Ajax 调用 ScalaJS 上禁止跨源本地主机

在 Angularjs 中的 IE10+ 中访问被拒绝 CORs 请求,需要跨源资源共享错误(信息?)

跨源请求被阻止的 CORS - 使用角度 cli 解决 [仅限开发人员] [重复]