使用 Jest 的 ReactJS 测试失败:无法读取未定义的 属性 'buffer'

ReactJS testing with Jest fails: Cannot read property 'buffer' of undefined

当我尝试测试 React 组件时 LoginForm.js 我在 LoginForm 中遇到错误。我在 LoginForm 中需要一个名为 joi 的模块。

TypeError: /home/jaisonjustus/project/captainmice/src/components/LoginForm/test/LoginForm.js: /home/jaisonjustus/project/captainmice/src/components/LoginForm/src/jsx/LoginForm.jsx: /home/jaisonjustus/project/captainmice/node_modules/joi/index.js: /home/jaisonjustus/project/captainmice/node_modules/joi/lib/index.js: /home/jaisonjustus/project/captainmice/node_modules/joi/lib/cast.js: /home/jaisonjustus/project/captainmice/node_modules/joi/lib/string.js: Cannot read property 'buffer' of undefined
  at Socket.self [as bytesWritten] (net.js:688:8)
  at _getMetadata (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/lib/moduleMocker.js:279:49)
  at _getMetadata (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/lib/moduleMocker.js:286:23)
  at _getMetadata (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/lib/moduleMocker.js:279:27)
  at Object.module.exports.getMetadata (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/lib/moduleMocker.js:388:20)
  at Loader._generateMock (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:282:56)
  at Loader.requireMock (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:796:43)
  at Loader.requireModuleOrMock (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:919:17)
  at /home/jaisonjustus/project/captainmice/node_modules/joi/lib/string.js:3:11
  at Object.runContentWithLocalBindings (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/lib/utils.js:357:17)
  at Loader._execModule (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:245:9)
  at Loader.requireModule (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:900:12)
  at Loader.requireModuleOrMock (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:921:17)
  at /home/jaisonjustus/project/captainmice/node_modules/joi/lib/cast.js:13:13
  at Object.runContentWithLocalBindings (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/lib/utils.js:357:17)
  at Loader._execModule (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:245:9)
  at Loader.requireModule (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:900:12)
  at Loader.requireModuleOrMock (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:921:17)
  at /home/jaisonjustus/project/captainmice/node_modules/joi/lib/index.js:5:12
  at Object.runContentWithLocalBindings (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/lib/utils.js:357:17)
  at Loader._execModule (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:245:9)
  at Loader.requireModule (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:900:12)
  at Loader.requireModuleOrMock (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:921:17)
  at /home/jaisonjustus/project/captainmice/node_modules/joi/index.js:1:85
  at Object.runContentWithLocalBindings (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/lib/utils.js:357:17)
  at Loader._execModule (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:245:9)
  at Loader.requireModule (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:900:12)
  at Loader.requireModuleOrMock (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:921:17)
  at /home/jaisonjustus/project/captainmice/src/components/LoginForm/src/jsx/LoginForm.jsx:3:11
  at Object.runContentWithLocalBindings (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/lib/utils.js:357:17)
  at Loader._execModule (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:245:9)
  at Loader.requireModule (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:900:12)
  at Loader.requireModuleOrMock (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:921:17)
  at /home/jaisonjustus/project/captainmice/src/components/LoginForm/test/LoginForm.js:6:17
  at Object.runContentWithLocalBindings (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/lib/utils.js:357:17)
  at Loader._execModule (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:245:9)
  at Loader.requireModule (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:900:12)
  at jasmineTestRunner (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/jasmineTestRunner/jasmineTestRunner.js:239:16)
  at /home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/TestRunner.js:371:12
  at _fulfilled (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/node_modules/q/q.js:798:54)
  at self.promiseDispatch.done (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/node_modules/q/q.js:827:30)
  at Promise.promise.promiseDispatch (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/node_modules/q/q.js:760:13)
  at /home/jaisonjustus/project/captainmice/node_modules/jest-cli/node_modules/q/q.js:574:44
  at flush (/home/jaisonjustus/project/captainmice/node_modules/jest-cli/node_modules/q/q.js:108:17)
  at /home/jaisonjustus/project/captainmice/node_modules/jest-cli/src/lib/FakeTimers.js:259:7
  at process._tickCallback (node.js:419:13)

文件夹结构

node_modules/
jest-preprocessor.js
src/
  components/
    LoginForm/
      src/
        jsx/
          LoginForm.jsx
        LoginForm.scss
      test/
        LoginForm.js

Jest 配置

{ 
      rootDir: 'src',
      testDirectoryName: 'test',
      testPathDirs: [ 'components' ],
      modulePathIgnorePatterns: [ '../node_modules/' ],
      scriptPreprocessor: '../jest-preprocess.js',
      moduleFileExtensions: [ 'js', 'jsx', 'json' ],
      unmockedModulePathPatterns: [ 
        '../node_modules/react’, 
        '../node_modules/joi’
      ] 
    }

这是我的workaround

This bug was really frustrating but now I'm using jest.autoMockOff(); at the top of my test file and it works fine. Presumably I'll be able to manually use jest.mock(..) on individual files but I haven't tried it yet.


更新:a fix 不需要您关闭自动模拟。