Как я могу использовать Mocha для тестирования моего пользовательского модуля, который требует Node API? "Невозможно прочитать свойство 'require' of undefined" - PullRequest
1 голос
/ 17 апреля 2019

Я создаю приложение Electron. Я настраиваю тестирование с Mocha и Spectron. Мокко ошибается на линии

const filebrowser = require("../src/filebrowser.js")

в частности, в модуле файлового браузера в строке 2 происходит сбой, когда я пытаюсь запросить модуль fs узла:

const {remote} = require('electron');
const fs = remote.require('fs');

Я полагаю, что это как-то связано с областью процесса Main / Renderer в Electron, но я не понимаю, как заставить его правильно работать с Mocha. Как мне правильно требовать, чтобы мои модули были в тестовом файле Mocha, когда они полагаются на API Node, к которому я обычно обращаюсь через удаленный модуль электрона?

test / test.js (это пример кода Spectron со страницы github). Я запускаю его командой "mocha" через скрипт package.json (тест npm). Обратите внимание, что я даже еще не написал тест для моего модуля filebrowser, он завершается ошибкой в ​​операторе require.

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 filebrowser = require("../src/filebrowser.js")

describe('Application launch', function () {
  this.timeout(10000)

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

      // use the main.js file in package.json located 1 level above.
      args: [path.join(__dirname, '..')]
    })

    return this.app.start()
  })

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

  it('shows an initial window', function () {
    return this.app.client.getWindowCount().then(function (count) {
        assert.equal(count, 1)
    })
  })
})

ЦСИ / filebrowser.js

const {remote} = require('electron');
const fs = remote.require('fs');
const Path = require('path');

module.exports = {        
    //note that I would be calling fs functions in here, but I never get that far because the error happens on remote.require('fs')
    determineFiletype: function(currentDirectory, fileName){}
}

1 Ответ

1 голос
/ 18 апреля 2019

После дополнительных исследований кажется, что Спектрон не в состоянии это сделать. Spectron запускается в процессе Webdriver, а не в основном процессе вашего электронного приложения. Это работает для сквозного тестирования, но не для обычного тестирования модулей. К счастью, модуль electronic-mocha отлично подходит для тестирования модулей. Он позволяет вам указать, из какого процесса запускать тесты, и какие модули включать в основной процесс. Лучше всего он работает в Chromium, так что вы можете получить доступ ко всем API вашего приложения, как обычно.

...