create-react-app 无法在升级从4.0.0到4.0.1后读取未定义的属性'matches',

nimxete2  于 2个月前  发布在  React
关注(0)|答案(9)|浏览(40)

在Windows系统上,从4.0.0升级到4.0.1后,react-scripts出现了问题。执行以下命令进行安装:

npm install

然后出现错误信息:

npm ERR! Cannot read property 'matches' of undefined

完整的错误日志可以在指定路径找到。降级回4.0.0版本后,问题解决。

wydwbb8l

wydwbb8l1#

你的项目是否需要进行测试?如果是的话,你应该在测试中对 window.matchMedia 进行模拟,例如通过
安装 jest-matchmedia-mock 通过 yarn add --dev jest-matchmedia-mock
然后将以下内容添加到 package.json

"jest": {
   ...
    "setupFilesAfterEnv": [
      "jest-matchmedia-mock",
    ]
  },
n1bvdmb6

n1bvdmb62#

我遇到了类似的问题,最后将我的模拟从

Object.defineProperty(window, 'matchMedia', {
  writable: true,
  value: jest.fn().mockImplementation(query => ({
    matches: false,
    media: query,
    onchange: null,
    addListener: jest.fn(), // Deprecated
    removeListener: jest.fn(), // Deprecated
    addEventListener: jest.fn(),
    removeEventListener: jest.fn(),
    dispatchEvent: jest.fn(),
  })),
});

更改为

window.matchMedia = (query) => ({
  matches: false,
  media: query,
  onchange: null,
  addListener: jest.fn(), // Deprecated
  removeListener: jest.fn(), // Deprecated
  addEventListener: jest.fn(),
  removeEventListener: jest.fn(),
  dispatchEvent: jest.fn(),
})

。话虽如此,我有种直觉,这可能是我注意到的其他问题的迹象,并正在调查。总的来说,我注意到jest似乎在某些情况下没有引用由 jest.fn 创建的模拟(几乎好像在运行时注入了另一个未引用测试中创建的模拟的函数)

inkz8wg9

inkz8wg93#

我遇到了同样的问题,@jarretmoses提出的修复方法解决了这个问题。然而,如果使用Object.defineProperty的原始模拟仍然有效,那么这些文档将需要更新。

7fhtutme

7fhtutme4#

我遇到了类似的问题,最后将我的模拟从

Object.defineProperty(window, 'matchMedia', {
  writable: true,
  value: jest.fn().mockImplementation(query => ({
    matches: false,
    media: query,
    onchange: null,
    addListener: jest.fn(), // Deprecated
    removeListener: jest.fn(), // Deprecated
    addEventListener: jest.fn(),
    removeEventListener: jest.fn(),
    dispatchEvent: jest.fn(),
  })),
});

更改为

window.matchMedia = (query) => ({
  matches: false,
  media: query,
  onchange: null,
  addListener: jest.fn(), // Deprecated
  removeListener: jest.fn(), // Deprecated
  addEventListener: jest.fn(),
  removeEventListener: jest.fn(),
  dispatchEvent: jest.fn(),
})

。话虽如此,我有种直觉,这可能是我注意到的其他问题的迹象,并正在调查。总的来说,我注意到jest似乎在某些情况下没有引用由 jest.fn 创建的模拟(几乎好像在运行时注入了另一个未引用测试中创建的模拟的函数)
不得不稍作调整,但这对我有效:

Object.defineProperty(window, 'matchMedia', {
  writable: true,
  value: (query) => ({
    matches: false,
    media: query,
    onchange: null,
    addListener: jest.fn(), // Deprecated
    removeListener: jest.fn(), // Deprecated
    addEventListener: jest.fn(),
    removeEventListener: jest.fn(),
    dispatchEvent: jest.fn(),
  }),
})
14ifxucb

14ifxucb5#

需要稍微调整一下
请说明您调整了哪些内容?我在src/setupTests.ts上也有相同的代码,但对我不起作用。

ztyzrc3y

ztyzrc3y6#

对于CRA用户,请在您的src/setupTests.ts中添加以下内容:

import MatchMediaMock from 'jest-matchmedia-mock';

new MatchMediaMock()
k5hmc34c

k5hmc34c7#

在我的原始评论末尾的示例中。

Object.defineProperty(window, 'matchMedia', {
  writable: true,
  value: (query) => ({
    matches: false,
    media: query,
    onchange: null,
    addListener: jest.fn(), // Deprecated
    removeListener: jest.fn(), // Deprecated
    addEventListener: jest.fn(),
    removeEventListener: jest.fn(),
    dispatchEvent: jest.fn(),
  }),
})

这是我使用的版本。

00jrzges

00jrzges8#

对于CRA用户,luksarisolution添加了以下内容到您的src/setupTests.ts:

import MatchMediaMock from 'jest-matchmedia-mock';

new MatchMediaMock()

这对我不起作用,我正在使用CRA。

vsdwdz23

vsdwdz239#

这个问题已经被自动标记为过时,因为它没有任何最近的活动。如果没有发生任何进一步的活动,它将在5天后被关闭。

相关问题