3

I'm working on some tests for an electron app I'm building. I'm running into the error below. I'm new to jest, so I imagine it's due to an incorrect setup. Any idea where I'm going wrong?

Error: Cannot find module 'ipcMain' from 'ipcMainEvents.spec.js'

//myEvents.ts

import { ipcMain } from 'electron'

export class IpcMainEvents {

    constructor() {
        ipcMain.on('openPlaywright', this.openPlaywright)
        ipcMain.on('openPreviewBrowser', this.openPlaywright)
    }


    openPlaywright(event, arg) {
        console.log('openPlaywright')
    }

    openPreviewBrowser(event, arg) {
        console.log('openPreviewBrowser')
    }
}

//myEvents.spec.ts

import {IpcMainEvents} from './ipcMainEvents'
import {ipcMain} from 'electron'
jest.mock('ipcMain')


describe('Should test the ipcMain events', () => {
    let component;
    let addSpy
    beforeEach(()=>{
        component = new IpcMainEvents()

    }) 
    it('should attach the eventListeners', () => { 

        expect(component.ipcMain.on.calls.all()[0].args[0]).toEqual('openPlaywright'); //<----Errors here
        expect(component.ipcMain.on.calls.all()[1].args[0]).toEqual('openPreviewBrowser');
        expect(component.ipcMain.on.calls.count()).toEqual(2);
    });

});
Lin Du
  • 88,126
  • 95
  • 281
  • 483
Justin Young
  • 2,393
  • 3
  • 36
  • 62

1 Answers1

5

Firstly, you should mock electron package, not ipcMain function.

Second, you should access the calls property of mocked function via .mock property.

E.g.

myEvents.ts:

import { ipcMain } from 'electron';

export class IpcMainEvents {
  constructor() {
    ipcMain.on('openPlaywright', this.openPlaywright);
    ipcMain.on('openPreviewBrowser', this.openPlaywright);
  }

  openPlaywright(event, arg) {
    console.log('openPlaywright');
  }

  openPreviewBrowser(event, arg) {
    console.log('openPreviewBrowser');
  }
}

myEvents.spec.ts:

import { IpcMainEvents } from './myEvents';
import { ipcMain } from 'electron';

jest.mock(
  'electron',
  () => {
    const mockIpcMain = {
      on: jest.fn().mockReturnThis(),
    };
    return { ipcMain: mockIpcMain };
  },
  { virtual: true },
);

describe('Should test the ipcMain events', () => {
  let component;
  let addSpy;
  beforeEach(() => {
    component = new IpcMainEvents();
  });
  it('should attach the eventListeners', () => {
    expect(ipcMain.on.mock.calls[0][0]).toEqual('openPlaywright');
    expect(ipcMain.on.mock.calls[1][0]).toEqual('openPreviewBrowser');
    expect(ipcMain.on.mock.calls).toHaveLength(2);
  });
});

unit test results with coverage report:

 PASS  stackoverflow/61562193/myEvents.spec.js (10.657s)
  Should test the ipcMain events
    ✓ should attach the eventListeners (3ms)

-------------|---------|----------|---------|---------|-------------------
File         | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------|---------|----------|---------|---------|-------------------
All files    |      80 |      100 |      50 |   77.78 |                   
 myEvents.js |      80 |      100 |      50 |   77.78 | 10,14             
-------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        11.917s
Lin Du
  • 88,126
  • 95
  • 281
  • 483