Могут ли Spectron, mocha и chai утверждать, что переменные имеют ожидаемые значения в приложении Electron?

Как мы можем утверждать, что переменная javascript, встроенная в HTML, имеет некоторое ожидаемое значение в приложении, созданном с помощью электронов? Текущая среда тестирования - это spectron, mocha, chai, chai.should () и chai.use (chaiAsPromised).

Я хочу заявить, что глобальная переменная foo имеет значение 'foo'. Когда я пытаюсь foo.should.equal('foo'), я получаю ReferenceError: foo is not defined at Context.<anonymous> (test\spec.js:63:28)

Ниже представлен переработанный spec.js.

const Application = require('spectron').Application
const assert = require('assert')
const electronPath = require('electron') // Require Electron from the binaries included in node_modules.
const path = require('path')
const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
const should = require('chai').should();

describe('Isolated testbeds house independent suites of tests.', function() {
  this.timeout(30000);

  before(function() {
    this.app = new Application({
      path: electronPath,

      // directory structure:

      //  |__ myProject
      //     |__ ...
      //     |__ main.js
      //     |__ package.json
      //     |__ index.html
      //     |__ ...
      //     |__ test
      //        |__ spec.js  <- You are here! ~ Well you should be.

      args: [path.join(__dirname, '..')]
    })
    return this.app.start()
  });

  after(function() {
    if (this.app && this.app.isRunning()) {
      return this.app.stop()
    }
  });

/* BELOW IS THE TEST IN QUESTION */
  it('should have a given value', function() {
    return Promise.resolve(foo).should.eventually.equal('foo'); // HERE IS THE LINE IN QUESTION
  });

})

person Kyle Thomas    schedule 01.03.2018    source источник


Ответы (1)


Spectron «дистанционно управляет» вашим приложением Electron и не находится в том же пространстве имен. Вот почему foo не определен в вашем тестовом скрипте.

Если foo находится в вашем интерфейсе Electron, вы можете получить к нему доступ, используя this.app.client, если он находится в DOM. this.app.browserWindow или this.app.webContents может иметь доступ к глобальным объектам?

(Я знаю, что executeJavaScript() не будет работать - любая функция, возвращающая обещание, в основном не будет работать.)

Если foo находится на вашем сервере, я показываю обходной путь в моем вопросе: Может ли Spectron вызвать функцию непосредственно на сервере? (но я все еще ищу подход, который не требует от меня изменения кода для тестирования)

person Darren Cook    schedule 02.03.2018