Numeric Production Mechanism

    electron-mock-ipc
    TypeScript icon, indicating that this package has built-in type declarations

    0.3.12 • Public • Published

    ElectronMockIPC

    Test npm GitHub release npm NPM

    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.

    Install

    npm i electron-mock-ipc

    DownloadsWeekly Downloads

    1,376

    Version

    0.3.12

    License

    MIT

    Unpacked Size

    46.4 kB

    Total Files

    22

    Last publish

    Collaborators

    • h3poteto