Mock Electron's ipcMain and ipcRenderer
npm install electron-mock-ipcThis is a mock library for ipcMain and ipcRenderer in Electron. They communicate with each other, so you can mock ipc methods in your tests without changing your production code.
```
$ npm install --save-dev electron-mock-ipc
or
``
$ yarn add --dev electron-mock-ipc
At first, please create a file to mock:
`typescript
import createIPCMock from 'electron-mock-ipc'
const mocked = createIPCMock()
const ipcMain = mocked.ipcMain
const ipcRenderer = mocked.ipcRenderer
export { ipcMain, ipcRenderer }
`spec/mock/electron-mock.ts
and save it as .
. Please override it in package.json.`json
"jest": {
"moduleNameMapper": {
"^electron$": "/spec/mock/electron-mock.ts"
}
}
`After that, all ipc objects are mocked, so you can write tests as below.
`typescript
import { IpcMainEvent } from 'electron'
import { ipcMain } from '~/spec/mock/electron-mock'
import { targetMethod } from '~/src/target'describe('your test', () => {
it('should be received', async () => {
ipcMain.once('test-event', (event: IpcMainEvent, obj: string) => {
event.sender.send('response-test-event', 'response' + obj)
})
const res = await targetMethod()
expect(res).toEqual('responsehoge')
})
})
`$3
In Mocha, you can not inject a mock object easily. So, please inject the ipcRenderer object in preload.js, and use preload.js to load electron.`javascript
import { ipcRenderer } from 'electron'
import { ipcRenderer as mock } from '~/spec/mock/electron-mock'if (process.env.NODE_ENV === 'test') {
global.ipcRenderer = mock
} else {
global.ipcRenderer = ipcRenderer
}
`preload.js is used to disable nodeIntegration, please refer here.
And write test.
`typescript
import { IpcMainEvent } from 'electron'
import { targetMethod } from '~/src/target'
import { ipcMain } from '~/spec/mock/electron'
import { describe, it } from 'mocha'
import { expect } from 'chai'describe('your test', () => {
it('should be received', async () => {
ipcMain.once('test-event', (event: IpcMainEvent, obj: string) => {
event.sender.send('response-test-event', 'response' + obj)
})
const res = await targetMethod()
expect(res).to.equal('responsehoge')
})
})
``The software is available as open source under the terms of the MIT License.