Jasmine: Fixing common errors during initialization

Due to the way we setup Jasmine tests in our projects, you may run into various errors when Jasmine boots.

Setting jasmineRequire on undefined

Jasmine 4 may fail with an error like this:

Uncaught TypeError: Cannot set properties of undefined (setting 'jasmineRequire')

This is due to issues in Jasmine's environment detection Show archive.org snapshot . It must be fixed by patching the Jasmine sources.

Fix for Webpacker

Add the package string-replace-loader to your package.json. If you're on Webpacker 5 (Webpack 4) the latest version you can use is 2.x.

Now add the following loader to your config/webpack/environment.js:

environment.loaders.prepend('fix-jasmine4-global-detection', {
  test: /jasmine-core\/lib\/jasmine-core\/jasmine\.js$/,
  use: [{
    loader: 'string-replace-loader',
    options: {
      search: 'window.toString() === \'[object GjsGlobal]\'',
      replace: 'window.toString() === \'[object Window]\''
    }
  }]
})

Fix for ESBuild / jsbundling-rails

Add the package esbuild-plugin-text-replace to your package.json.

Now add the following plugin to your esbuild.config.js:

const textReplace = require('esbuild-plugin-text-replace')
const esbuild = require('esbuild')

esbuild.build({
  ...
  plugins: [
    textReplace({
      include: /jasmine-core\/lib\/jasmine-core\/jasmine\.js$/,
      pattern: [
        ['let jasmineRequire;', 'let jasmineRequire; const global = window;'],
      ],
    }),
  ],
})

If you are on Jasmine < 4.3.0, use var instead of let in the code above.

Missing getJasmineRequireObj()

If you get this error:

Uncaught ReferenceError: getJasmineRequireObj is not defined

then you need a manually expose getJasmineRequireObj() to your specs.

Fix for Webpack

Add a file

// app/webpack/spec/support/jasmine_provider.js
import jasmineRequire from 'jasmine-core/lib/jasmine-core/jasmine.js'

export default function getJasmineRequireObj() {
  return jasmineRequire;
}

Then expose the provider in your config/webpack/environment.js:

const webpack = require('webpack')

environment.plugins.prepend('Provide', new webpack.ProvidePlugin({
  getJasmineRequireObj: ['spec/support/jasmine_provider.js', 'default'],
}))

Fix for ESBuild / jsbundling-rails

TODO.

Henning Koch About 2 years ago