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.