【问题标题】:Error: Not implemented: window.scrollTo. How do we remove this error from Jest test?错误:未实现:window.scrollTo。我们如何从 Jest 测试中删除这个错误?
【发布时间】:2023-06-24 18:58:01
【问题描述】:

错误:

console.error node_modules/jsdom/lib/jsdom/virtual-console.js:29
      Error: Not implemented: window.scrollTo
          at module.exports (/Users/me/Projects/my-project/node_modules/jsdom/lib/jsdom/browser/not-implemented.js:9:17)
          at /Users/me/Projects/my-project/node_modules/jsdom/lib/jsdom/browser/Window.js:594:7

因为我们使用的是window.scrollTo(0,0)

同时获得Not implemented Navigation 用于:

window.location.replace(externa_link).assign 发生同样的错误。

我尝试使用 react-router 搜索解决方案,但所有示例都使用了一些包含 window.location 的组件。

有没有办法避免这个错误?还是藏起来?

我做了一些研究,发现 Facebook 团队不会解决这个问题。有没有办法在运行jest test 时抑制这些错误/警告?

我们的代码不会中断,否则所有测试都会通过。

【问题讨论】:

  • 你在用--env=jsdom 参数开玩笑吗?
  • 哦,成功了!谢谢 :D 想发布答案吗?我们仍然得到这个Error: Not implemented window.scrollTo,但我会为此发布一个新问题。
  • 很高兴它成功了!

标签: javascript reactjs jestjs


【解决方案1】:

尝试使用 --env=jsdom 运行 jest 命令。这将模拟大多数浏览器功能并解决您的问题。

还有更多设置测试环境的方法,看看:

https://jestjs.io/docs/en/configuration#testenvironment-string

更新

这适用于window.scrollTo 错误

https://qiita.com/akameco/items/0edfdae02507204b24c8

【讨论】:

  • 呃,我可能说得太早了,我们实际上仍然收到 Not implemented: navigation 错误...我能够摆脱 scrollTo 错误。将不得不继续调查。
  • global.scrollTo = jest.fn()
  • 更新链接(qiita.com)完美运行
【解决方案2】:

如果您只是想让window.scrollTo(0,0) 在您的测试环境中正常工作,您可以在您的任何setupFilesAfterEnv 文件中实现它:

window.scrollTo = (x, y) => {
  document.documentElement.scrollTop = y;
}

【讨论】:

    【解决方案3】:

    在调用具有window.scrollTo 的组件的*.test.js 文件中

    it("renders without crashing", () => {
      window.scrollTo = jest.fn()
    })
    

    【讨论】:

      【解决方案4】:

      使用 create-react-app 时,最好将功能添加到设置测试文件中:

      <project_name>\src\setupTests.js
      

      我选择实现zgreen's answer

      window.scrollTo = (x, y) => {
        document.documentElement.scrollTop = y;
      }
      

      这样,任何使用该功能的组件都将正确解析。

      【讨论】:

        【解决方案5】:

        在导入后的测试文件顶部模拟它:

        window.scrollTo = jest.fn();
        

        然后在describe里面加上这个:

          afterAll(() => {
            jest.clearAllMocks();
          });
        

        因此,如果您在每次之后还重置所有模拟,那么您最终会得到这个 ::

        afterEach(() => {
            jest.resetAllMocks();
          });
          afterAll(() => {
            jest.clearAllMocks();
          });
        

        【讨论】: