使用 Jest 进行测试时使用 Spectron 来“模拟”Electron

Nar*_*tor 5 jestjs electron spectron

我正在使用 Jest 测试 Electron 应用程序的库代码。Jest 对 做了奇怪的事情require,这干扰了 Electron 需要做的事情......我认为。

Spectron 旨在允许您从测试框架内访问各种 Electron 位,允许您通过库调用创建 Electron 应用程序。

最终,我需要能够使用Electron 中的一些require('electron')真实内容进行模拟(例如浏览器窗口的创建),主要是为了使各种库位可以按预期工作。

看起来应该是这样的:

在 package.json 中:

  "jest": {
    "moduleNameMapper": {
      "^electron$": "<rootDir>/test/mocks/electron.js"
    }
  }
Run Code Online (Sandbox Code Playgroud)

测试/模拟/ Electron.js:

const Path = require("path")
const Application = require('spectron').Application
const electronPath = Path.join(__dirname, "../../node_modules/electron/dist/Electron.app/Contents/MacOS/Electron")
const app = new Application({ path: electronPath })
module.exports = app.electron
Run Code Online (Sandbox Code Playgroud)

根据文档,应该提供与正常操作下app.electron相同的访问权限。require('electron')

一些测试:

const { BrowserWindow } = require("electron")
test("some test", () => {
  const window = new BrowserWindow()
  // ...
})
Run Code Online (Sandbox Code Playgroud)

然而,这会失败,因为app.electron尽管App它本身已定义,但未定义:

    console.log test/mocks/electron.js:58
  <ref *1> Application {
    host: '127.0.0.1',
    port: 9515,
    quitTimeout: 1000,
    startTimeout: 5000,
    waitTimeout: 5000,
    connectionRetryCount: 10,
    connectionRetryTimeout: 30000,
    nodePath: '~/.nvm/versions/node/v13.0.1/bin/node',
    path: '~/electron-hello-world/node_modules/electron/dist/Electron.app/Contents/MacOS/Electron',
    args: [],
    chromeDriverArgs: [],
    env: {},
    workingDirectory: '~/electron-hello-world',
    debuggerAddress: undefined,
    chromeDriverLogPath: undefined,
    webdriverLogPath: undefined,
    webdriverOptions: {},
    requireName: 'require',
    api: Api { app: [Circular *1], requireName: 'require' },
    transferPromiseness: [Function (anonymous)]
  }
Run Code Online (Sandbox Code Playgroud)

不太确定从这里去哪里。寻找任何解决方案