【问题标题】:Jest error -- Cannot read property 'get' of undefined开玩笑的错误——无法读取未定义的属性“get”
【发布时间】:2021-05-29 23:32:14
【问题描述】:

我在 React 的一个组件中配置了一项服务,但我遇到了 jest 和测试库的问题,应用程序正在运行,但测试被阻塞。

  import { appSetupConfig } from '.../myapp'
  import theConfig from '.../config'

  useEffect(() => {
    const allowAppInstance = appSetupConfig();

    allowAppInstance.get(theConfig).then((value) => {
       if (value.something) {
           Do Something;
       } 
    ...the rest of code

  }, []);

这个 theConfig 是一个包含对象的外部文件。 这是错误:

  TypeError: Cannot read property 'get' of undefined

  37 |     const allowAppInstance = appSetupConfig();
  38 | 
> 39 |     allowAppInstance.get(theConfig).then((value) => {

有没有办法在 jest 的 setup.js 中模拟这个 get? 我不一定需要测试这个项目,但没有它我就无法继续。

【问题讨论】:

    标签: javascript reactjs unit-testing jestjs react-testing-library


    【解决方案1】:

    是的,有。因此,您似乎在某个时候调用了jest.mock('.../myapp') 或类似名称。在 Jest 为模块创建的模拟对象中,每个模拟函数都返回 undefined。您需要在appSetupConfig 上模拟一个返回值,它本身就是一个模拟对象,具有您需要的方法,例如get。然后get 又需要返回一个模拟承诺,依此类推。在您的设置文件中,这看起来像:

    import { appSetupConfig } from '.../myapp'
    ...
    jest.mock('.../myapp');
    appSetupConfig.mockReturnValue({
      get: jest.fn().mockResolvedValue({ something: jest.fn() }),
    });
    

    然后,您的 .then 块将在测试中被调用,并将 value 设置为 undefined,但您可以模拟不同的解析值或拒绝特定测试的承诺。

    【讨论】:

    • 非常感谢!但是现在我在 value.something 中遇到了同样的错误。这个笑话好难=(
    • 确实,您必须在返回值中继续模拟返回值,直到涵盖从您正在测试的模块访问的所有内容。如果这很纠结,您可以将其集中在一个 module factory 中,用于整个 myapp 模拟。
    • 我需要做与.get 相同的事情吗?你能给我举个例子吗?非常感谢你帮助我
    • 是的,它看起来一直都是一样的。我编辑了我的答案以显示get 的模拟解析值是一个具有模拟函数something 的对象。
    猜你喜欢
    • 2023-03-03
    • 2020-06-26
    • 2022-01-18
    • 2020-11-19
    • 2018-06-17
    • 2018-09-05
    • 1970-01-01
    • 2019-08-08
    • 2020-06-04
    相关资源
    最近更新 更多