electron-mock-ipc
Version:
Mock Electron's ipcMain and ipcRenderer
111 lines (83 loc) • 3.31 kB
Markdown
[](https://github.com/h3poteto/electron-mock-ipc/actions/workflows/test.yml)
[](https://www.npmjs.com/package/electron-mock-ipc)
[](https://github.com/h3poteto/electron-mock-ipc/releases)
[](https://www.npmjs.com/package/electron-mock-ipc)
[](/LICENSE.txt)
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.
```
$ npm install --save-dev electron-mock-ipc
```
or
```
$ yarn add --dev electron-mock-ipc
```
This library can use in jest, and mocha.
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 }
```
and save it as `spec/mock/electron-mock.ts`.
In Jest, please replace electron object using `moduleNameMapper`. Please override it in `package.json`.
```json
"jest": {
"moduleNameMapper": {
"^electron$": "<rootDir>/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')
})
})
```
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](https://stackoverflow.com/questions/52236641/electron-ipc-and-nodeintegration).
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')
})
})
```
I prepared a test example, please refer [here](example).
The software is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).