Реагирование на события ipcMain в Spectron - PullRequest
0 голосов
/ 04 июля 2019

У меня есть электронное приложение, которое сначала запускает окно запуска (в процессе визуализации), которое запускает несколько фоновых служб.После того, как эти фоновые службы были успешно запущены, он отправляет "services-running" на своем ipcRenderer обратно в основной процесс, который, в свою очередь, реагирует на это событие, закрывая окно запуска и запуска основного окна приложения.Событие, конечно, получено ipcMain.on('services-running',...)

. Я проверил все обработчики по отдельности, поэтому все в порядке, и теперь я хочу провести интеграционное тестирование событий, которые проходят через ipcMain.

ЭтоВот как выглядит мой интеграционный тест:

import { Application } from 'spectron';
import * as electron from "electron";
import { expect } from 'chai';
import * as chai from 'chai';
import * as chaiAsPromised from 'chai-as-promised';

let app: Application;

global.before(() => {
    app = new Application({
        path: "" + electron,
        args: ["app/main.js"],
        env: {
            ELECTRON_ENABLE_LOGGING: true,
            ELECTRON_ENABLE_STACK_DUMPING: true,
            NODE_ENV: "integrationtest"
        },
        startTimeout: 20000,
        chromeDriverLogPath: '../chromedriverlog.txt'
    });

    chai.use(chaiAsPromised);
    chai.should();
});

describe('Application', () => {

    before('Start Application', () => {
        return app.start();
    });

    after(() => {
        if(app && app.isRunning()){
            return app.stop();
        }
    });

    it('should start the launcher', async  () => {
        await app.client.waitUntilWindowLoaded();
        return app.client.getTitle().should.eventually.equal('Launcher');
    });

    it('should start all services before timing out', async (done) => {
        console.log('subscribed');
        app.electron.remote.ipcMain.on('services-running', () => {
            done();
        });
    });

});

Первый тест работает нормально.Второй тест в конечном итоге не пройдёт после истечения времени ожидания, хотя я вижу subscribed на оболочке до того, как всплывет главное окно, поэтому событие определенно запускается.

Я прочитал в документации, что nodeIntegrationдолжен быть включен доступ к полным электронным API со спектроном, все мои процессы рендеринга запускаются с {nodeIntegration: true} в соответствующих webPreferences.Но так как меня интересует основной процесс, я думаю, что это не относится (или, по крайней мере, я думаю, что это не так, поскольку основной процесс сам по себе является процессом узла).

Поэтому мой главный вопрос заключается в том, какя бы связал с ipcMain событиями и включил бы те в мои утверждения.Также, как я узнаю, когда окно запуска закрыто и "главное" окно открыто?

В качестве бонуса у меня есть некоторые проблемы с пониманием api spectron.

  1. Если я посмотрю на spectron.d.ts, свойство electron Application имеет тип Electron.AllElectron, который, в свою очередь, является MainInterface и непосредственно имеет ipcMain имущество.Таким образом, в моем понимании доступ к ipcMain должен быть app.electron.ipcMain (который не определен), откуда этот удаленный источник и почему он невидим в spectron.d.ts.

  2. Методына SpectronClient все возвращают Promise<void>.Так что я должен await или then тех.Если я посмотрю на примеры javascript, они объединят операторы клиента:

return app.client
  .waitUntilWindowLoaded()
  .getTitle().should.equal('Launcher');

Это не работает в машинописи, потому что вы не можете, очевидно, связать с Promise<void>, ..Как это работает в JS?

...