У меня есть электронное приложение, которое сначала запускает окно запуска (в процессе визуализации), которое запускает несколько фоновых служб.После того, как эти фоновые службы были успешно запущены, он отправляет "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.
Если я посмотрю на spectron.d.ts
, свойство electron
Application
имеет тип Electron.AllElectron
, который, в свою очередь, является MainInterface
и непосредственно имеет ipcMain
имущество.Таким образом, в моем понимании доступ к ipcMain
должен быть app.electron.ipcMain
(который не определен), откуда этот удаленный источник и почему он невидим в spectron.d.ts
.
Методына SpectronClient
все возвращают Promise<void>
.Так что я должен await
или then
тех.Если я посмотрю на примеры javascript, они объединят операторы клиента:
return app.client
.waitUntilWindowLoaded()
.getTitle().should.equal('Launcher');
Это не работает в машинописи, потому что вы не можете, очевидно, связать с Promise<void>
, ..Как это работает в JS?