如何使用jest测试电子ipc事件?

问题描述 投票:0回答:1

我正在为我构建的一个电子应用进行一些测试。我遇到了下面的错误。 我是一个新的jest,所以我想这是由于一个不正确的设置造成的。 你知道我哪里出错了吗?

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);
    });

});
unit-testing electron jest wallaby.js
1个回答
0
投票

首先,你应该模拟 electron 包,不是 ipcMain 功能。

其次,你应该访问 calls 的属性,通过 .模拟财产.

例如:

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);
  });
});

单元测试结果与覆盖率报告。

 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
© www.soinside.com 2019 - 2024. All rights reserved.