electron-mock-ipc
v0.3.12
Published
Mock Electron's ipcMain and ipcRenderer
Downloads
4,138
Maintainers
Readme
ElectronMockIPC
This 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.
Install
$ npm install --save-dev electron-mock-ipc
or
$ yarn add --dev electron-mock-ipc
Usage
This library can use in jest, and mocha.
At first, please create a file to mock:
import createIPCMock from 'electron-mock-ipc'
const mocked = createIPCMock()
const ipcMain = mocked.ipcMain
const ipcRenderer = mocked.ipcRenderer
export { ipcMain, ipcRenderer }
and save it as spec/mock/electron-mock.ts
.
Jest
In Jest, please replace electron object using moduleNameMapper
. Please override it in package.json
.
"jest": {
"moduleNameMapper": {
"^electron$": "<rootDir>/spec/mock/electron-mock.ts"
}
}
After that, all ipc objects are mocked, so you can write tests as below.
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')
})
})
Mocha
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.
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.
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')
})
})
Example
I prepared a test example, please refer here.
License
The software is available as open source under the terms of the MIT License.