Jest 中的模拟过程方法

rel*_*l1x 2 javascript unit-testing node.js jestjs electron

我有electron-util.js我想用测试覆盖的文件:

\n\n
const isElectron = "electron" in process.versions;\n\nconst isUsingAsar =\n  isElectron &&\n  process.mainModule &&\n  process.mainModule.filename.includes("app.asar");\n\nexport const fixPathForAsarUnpack = path =>\n  isUsingAsar ? path.replace("app.asar", "app.asar.unpacked") : path;\n
Run Code Online (Sandbox Code Playgroud)\n\n

为了测试fixPathForAsarUnpack方法,我需要模拟versionsmainModulefrom process. 我尝试这样做:

\n\n
import { fixPathForAsarUnpack } from "../src/electron-util";\n\ntest("fixes path for Electron", () => {\n  process.versions = {\n    electron: "0.0.0",\n    mainModule: {\n      filename: "/app.asar/index.html"\n    }\n  };\n\n  const path =\n    "/Users/relix/My.app/Contents/Resources/app.asar/node_modules/foo/binary";\n\n  expect(fixPathForAsarUnpack(path)).toBe(\n    "/Users/relix/My.app/Contents/Resources/app.asar.unpack/node_modules/foo/binary"\n  );\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

但它会抛出一个错误:

\n\n
  \xe2\x97\x8f fixes path for Electron\n\n    TypeError: Cannot assign to read only property \'versions\' of object \'[object process]\'\n\n      4 |\n      5 | test("fixes path for Electron", () => {\n    > 6 |   process.versions = {\n        |   ^\n      7 |     electron: "0.0.0",\n      8 |     mainModule: {\n      9 |       filename:\n\n      at Object.<anonymous>.test (__test__/electron-util.test.js:6:3)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我做错了什么,我应该如何模拟process对象?

\n

Ema*_*oli 6

您应该以这种方式模拟该过程:

const originalProcess = process
global.process = {...originalProcess, version: "your code here"}
// do the test
// ...
// restore the original process object for next tests
global.process = originalProcess
Run Code Online (Sandbox Code Playgroud)