Transforms and examples for testing Svelte components.
There are details on the transforms below. You can view example test setups in /examples/.
Install jest and svelte-test.
yarn add --dev jest svelte-test # or npm i -D jest
In your jest config file add svelte-test/transform as a transform for Svelte components (whatever file extension you use). Add any preprocessors to globals.svelte.preprocess and any custom compiler options to globals.svelte.compilerOptions. Your Jest config file will need to be a javascript file.
The jest.config.js should look something like this:
module.exports = {
testPathIgnorePatterns: ['/node_modules/', '/cypress/'],
transform: {
'^.+\\.svelte$': 'svelte-test/transform',
},
globals: {
svelte: {
preprocess: preprocess(),
compilerOptions: {
accessors: true,
},
},
},
};
You will probably need to install babel as well, to save you a lifetime of hell I will provide basic instructions.
Install babel-jest, @babel/core, and @babel/preset-env.
yarn add --dev babel-jest @babel/core @babel/preset-env #or npm i ...
Create a babel.config.js that looks like this:
module.exports = function(api) {
api.cache(true);
return {
presets: [
[
'@babel/preset-env',
{
targets: {
node: 'current',
},
},
],
],
};
};
You can now do this in your tests:
import App from '../App.svelte';
test('The component should exist', () => {
const component = new App({ target: document.body });
expect(component).toBeTruthy();
});
You may now go on with your life.
If you are not using jest you can still hook into node requires and get back a real, genuine, compiled component. What you do with that component is your business.
Install require-extension-hooks and svelte-test:
yarn add --dev require-extension-hooks svelte-test # or npm i ...
Wherever you are doing your magic, import require-extension-hooks and svelte-test/require.
const hooks = require('require-extension-hooks');
const svelte = require('svelte-test/require');
You need to pass the svelte() function the absolute path to your preprocessors as the first argument and any compiler options as the second argument, I haven't completely thought through the API so this may change in the future. You can then push the svelte function as a require hook for your component file extension like so:
const hooks = require('require-extension-hooks');
const svelte = require('svelte-test/require');
const { join } = require('path');
const preprocessors = join(__dirname, './less.js');
const compilerOptions = { accessors: true };
const extensionHook = svelte(preprocessors, compilerOptions);
hooks('.svelte').push(extensionHook);
// You can just require it
const App = require('./App.svelte');
// This is now a constructor function as expected.
const app = new App(options);