twolfson / karma-electron

Karma launcher and preprocessor for Electron
The Unlicense
59 stars 21 forks source link

Expected process.type === 'renderer' in tests #19

Closed timfish closed 7 years ago

timfish commented 7 years ago

Using the latest version of karma-electron, I was hoping all the tests would be run in a full render process. However the following test:

describe('test setup', () => {
  it('running in render process', () => {
    expect(process.type).toEqual('renderer');
  });
});

Fails with ReferenceError: process is not defined

Here is the full output:

06 03 2017 22:41:11.969:INFO [karma]: Karma v1.4.1 server started at http://0.0.0.0:9876/
06 03 2017 22:41:11.972:INFO [launcher]: Launching browser Electron with unlimited concurrency
06 03 2017 22:41:11.987:INFO [launcher]: Starting browser Electron
06 03 2017 22:41:13.777:INFO [Electron 1.4.14 (Node 6.5.0)]: Connected on socket g4QgvpKmHdzrxJwpAAAA with id 87957279
Electron 1.4.14 (Node 6.5.0) ERROR: TypeError{}

Electron 1.4.14 (Node 6.5.0) test setup running in render process FAILED
        ReferenceError: process is not defined
            at Object.eval (src/test/test.spec.ts!transpiled:20:28)
Electron 1.4.14 (Node 6.5.0): Executed 1 of 1 (1 FAILED) (0.048 secs / 0.039 secs)
error Command failed with exit code 1.

I can see an electron process spawning up and closing after.

twolfson commented 7 years ago

Interesting, I'm going to guess this is being caused by the usage of require but I'll take a deeper look by the end of this week

timfish commented 7 years ago

I'm using SystemJS and transpiling from TypeScript. Below is my full config:

module.exports = function (config) {
  config.set({
    basePath: './',
    frameworks: ['systemjs', 'jasmine'],
    systemjs: {
      configFile: 'www/config.js',
      config: {
        paths: {
          "*": "*",
          "src/*": "src/*",
          "github:*": "www/jspm_packages/github/*",
          "npm:*": "www/jspm_packages/npm/*",
          "typescript": "node_modules/typescript/lib/typescript.js",
          "systemjs": "node_modules/systemjs/dist/system.js",
          'system-polyfills': 'node_modules/systemjs/dist/system-polyfills.js'
        },
        packages: {
          'src': {
            defaultExtension: 'ts'
          }
        },
        transpiler: 'typescript',
        typescriptOptions: {
          "module": "system",
          "emitDecoratorMetadata": true,
          "experimentalDecorators": true
        }
      },
      serveFiles: [
        'src/**/*.*',
        'www/jspm_packages/**/*.js'
      ]
    },
    files: [
      'src/**/*.spec.*'
    ],
    exclude: [],
    reporters: ['progress'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Electron'],
    singleRun: false
  });
};
timfish commented 7 years ago

I've created a basic repository which reproduces this issue. https://github.com/timfish/karma-electron-test

I have also noticed that I no longer see the electron window when the tests are running.

timfish commented 7 years ago

I've worked out what's going wrong. I don't know what has changed (electron or karma) but the tests are being loaded in an iframe which don't have access to all the electron apis.

Simply adding the following to my karma.conf.js file gets it all working again:

client: {
  runInParent: true,
  useIframe: false
}

Can you override the defaults in the plugin?

timfish commented 7 years ago

By the way, I think require can be fixed by setting NODE_PATH. https://github.com/electron/electron/issues/2414

twolfson commented 7 years ago

Thanks for your work on this so far

This plugin doesn't configure Karma in any way -- we force the useIframe convention via documentation:

https://github.com/twolfson/karma-electron/tree/5.1.1#getting-started

While runInParent might work, I feel like it could lead to undesired edge cases (e.g. continuous runs could have leaks between tests). I would like to leave this issue open so we can fix the iframe scenario

The linked Electron issue, electron/electron#2414, states NODE_PATH is a way to fix absolute node_modules (e.g. require('underscore')) but there is no fix for relative node_modules (e.g. require('./utils')) so we still need to overwrite require

twolfson commented 7 years ago

Starting at my attempt to reproduce the issue

twolfson commented 7 years ago

Our repository dependencies seem to have process.type defined as renderer. That's:

"electron": "~1.3.3",
...
"karma": "~1.1.0",

Going to try out your repo now to see if we can reproduce from that. Then we'll binary search for the source

twolfson commented 7 years ago

While cloning/installing dependencies for the repro repo, we verified that latest Karma and Electron show process.renderer (albeit console.log stopped working so we need to look into that...):

"electron": "~1.6.2",
...
"karma": "~1.5.0",

Update: console.log was caused by log level changes in Karma https://github.com/karma-runner/karma/pull/2540

twolfson commented 7 years ago

Cool, we got a successful error reproduction with the repo you provided

twolfson commented 7 years ago

Okay, we have figured out the source of the issue. It's due to missing the required configuration from the README. We missed that during the initial bug report. To repair the issue, add the following to your karma.conf.js:

preprocessors: {
  '**/*.js': ['electron']
},
client: {
  useIframe: false
},

Reference documentation:

https://github.com/twolfson/karma-electron/tree/5.1.1#getting-started