mirror of
https://github.com/symfony/stimulus-testing.git
synced 2026-03-24 09:02:06 +01:00
Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2dd8302c75 | ||
|
|
17420a4b7c | ||
|
|
07d2209dd5 | ||
|
|
7194dc04c9 | ||
|
|
25bca2c62e | ||
|
|
0438da3771 | ||
|
|
9588a2bde0 | ||
|
|
edd246b564 | ||
|
|
cc5151bde1 | ||
|
|
b79342d6c4 | ||
|
|
78f5aef61c | ||
|
|
40c5c8bcbf | ||
|
|
3c7697ace8 | ||
|
|
12edab3d80 | ||
|
|
700a81d8bf | ||
|
|
ba70448d7d | ||
|
|
40093b653e | ||
|
|
499a4e94d2 | ||
|
|
6d5960463c | ||
|
|
49abd8e04c | ||
|
|
6e7dcadb97 |
3
.babelrc
3
.babelrc
@@ -1,4 +1,3 @@
|
||||
{
|
||||
"presets": ["@babel/env"],
|
||||
"plugins": ["@babel/plugin-proposal-class-properties"]
|
||||
"presets": ["@babel/env"]
|
||||
}
|
||||
|
||||
14
.github/workflows/test.yaml
vendored
14
.github/workflows/test.yaml
vendored
@@ -1,6 +1,6 @@
|
||||
name: Symfony UX
|
||||
|
||||
on: push
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
coding-style:
|
||||
@@ -9,5 +9,13 @@ jobs:
|
||||
- uses: actions/checkout@master
|
||||
- name: Prettier
|
||||
run: |
|
||||
yarn global add prettier@^2.2.0
|
||||
~/.yarn/bin/prettier --check src/**/*.js --config .prettierrc.json
|
||||
yarn add prettier@^2.2.0
|
||||
yarn run prettier --check {src,test}/**/*.js --config .prettierrc.json
|
||||
|
||||
tests:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
- run: |
|
||||
yarn
|
||||
yarn test
|
||||
|
||||
55
README.md
55
README.md
@@ -1,10 +1,50 @@
|
||||
# Symfony UX Stimulus testing
|
||||
|
||||
Symfony UX Stimulus testing is an low-level package to help write tests for Stimulus controllers
|
||||
in applications and reusable packages.
|
||||
> [!WARNING]
|
||||
> **Deprecated**: This package is deprecated and will not receive any further updates.
|
||||
|
||||
**If you are developing a project with Symfony Flex, you should probably use the ux-test-pack
|
||||
instead**. The pack includes this package and configures it automatically in your application.
|
||||
Because this package only provides very small helpers to help write tests for Stimulus controllers, and is tightly coupled with [Jest](https://jestjs.io/), [jsdom](https://github.com/jsdom/jsdom) and [Testing Library](https://testing-library.com/) dependencies, we can no longer recommend it.
|
||||
|
||||
In 2025, we cannot force developers to install Jest (and [~270 sub-dependencies](https://npmgraph.js.org/?q=jest) including [Babel](https://babeljs.io/)) and the like, since [many test runners exist](https://npmtrends.com/ava-vs-japa-vs-jasmine-vs-jest-vs-karma-vs-mocha-vs-tap-vs-vitest), and many of them are more modern and much faster, like [Vitest](https://vitest.dev/).
|
||||
|
||||
We want to give you the choice to use the best tools for your needs, and not force you to use what we suggested in the past.
|
||||
|
||||
To migrate from `@symfony/stimulus-testing`, you can follow these steps:
|
||||
|
||||
1. Install the dev dependencies `@testing-library/jest-dom @testing-library/dom`;
|
||||
you may also want to install `mutationobserver-shim regenerator-runtime` if you still have
|
||||
legacy code or _architecture_.
|
||||
2. In the file `assets/test/setup.js`, replace imports:
|
||||
```diff
|
||||
-import '@symfony/stimulus-testing/setup';
|
||||
+import '@testing-library/jest-dom';
|
||||
```
|
||||
3. Create the file `assets/test/stimulus-helpers.js` with the following content:
|
||||
```js
|
||||
export function mountDOM(html = '') {
|
||||
const div = document.createElement('div');
|
||||
div.innerHTML = html;
|
||||
document.body.appendChild(div);
|
||||
|
||||
return div;
|
||||
}
|
||||
|
||||
export function clearDOM() {
|
||||
document.body.innerHTML = '';
|
||||
}
|
||||
```
|
||||
4. In your tests files, replace imports for `mountDOM` and `clearDOM`:
|
||||
```diff
|
||||
// assets/test/controllers/hello_controller.test.js
|
||||
-import { clearDOM, mountDOM } from '@symfony/stimulus-testing';
|
||||
+import { clearDOM, mountDOM } from '../stimulus-helpers';
|
||||
```
|
||||
5. And finally, remove the `@symfony/stimulus-testing` dependency from your project.
|
||||
|
||||
---
|
||||
|
||||
Symfony UX Stimulus testing is a low-level package to help write tests for Stimulus controllers
|
||||
in applications and reusable packages.
|
||||
|
||||
Symfony UX Stimulus testing is currently considered **experimental**.
|
||||
|
||||
@@ -31,7 +71,7 @@ To start using Symfony UX Testing, you first need to configure a testing environ
|
||||
2. Create a `assets/test/setup.js` file to initialize Symfony UX Testing:
|
||||
|
||||
```js
|
||||
import '@symfony/ux-testing/setup';
|
||||
import '@symfony/stimulus-testing/setup';
|
||||
```
|
||||
|
||||
3. Create a `assets/jest.config.js` file for Jest configuration:
|
||||
@@ -48,14 +88,15 @@ module.exports = {
|
||||
|
||||
```json
|
||||
{
|
||||
"presets": ["@babel/env"],
|
||||
"presets": ["@babel/preset-env"],
|
||||
"plugins": ["@babel/plugin-proposal-class-properties"]
|
||||
}
|
||||
```
|
||||
|
||||
5. Finally, create your first test, for instance `hello_controller.test.js`:
|
||||
|
||||
```js
|
||||
import { Application } from 'stimulus';
|
||||
import { Application } from '@hotwired/stimulus';
|
||||
import { clearDOM, mountDOM } from '@symfony/stimulus-testing';
|
||||
import HelloController from '../controllers/hello_controller.js';
|
||||
|
||||
|
||||
30
dist/index.js
vendored
30
dist/index.js
vendored
@@ -1,30 +0,0 @@
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.mountDOM = exports.clearDOM = void 0;
|
||||
|
||||
var mountDOM = function mountDOM() {
|
||||
var htmlString = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
||||
var div = document.createElement('div');
|
||||
div.innerHTML = htmlString;
|
||||
document.body.appendChild(div);
|
||||
return div;
|
||||
};
|
||||
|
||||
exports.mountDOM = mountDOM;
|
||||
|
||||
var clearDOM = function clearDOM() {
|
||||
document.body.innerHTML = '';
|
||||
};
|
||||
|
||||
exports.clearDOM = clearDOM;
|
||||
15
dist/setup.js
vendored
15
dist/setup.js
vendored
@@ -1,15 +0,0 @@
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
require("mutationobserver-shim");
|
||||
|
||||
require("regenerator-runtime/runtime.js");
|
||||
|
||||
require("@testing-library/jest-dom");
|
||||
21
package.json
21
package.json
@@ -1,18 +1,15 @@
|
||||
{
|
||||
"name": "@symfony/stimulus-testing",
|
||||
"description": "@testing-library integration for Symfony UX",
|
||||
"version": "1.0.0",
|
||||
"main": "dist/index.js",
|
||||
"version": "2.1.0",
|
||||
"main": "src/index.js",
|
||||
"license": "MIT",
|
||||
"author": "Titouan Galopin <galopintitouan@gmail.com>",
|
||||
"engines": {
|
||||
"node": "^10.13.0 || >=12.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "babel src -d dist"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"stimulus": "^1.0"
|
||||
"test": "jest"
|
||||
},
|
||||
"dependencies": {
|
||||
"@testing-library/dom": "^7.28.1",
|
||||
@@ -24,14 +21,18 @@
|
||||
"regenerator-runtime": "^0.13.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.12.1",
|
||||
"@babel/core": "^7.12.3",
|
||||
"@babel/plugin-proposal-class-properties": "^7.12.1",
|
||||
"@babel/preset-env": "^7.12.7"
|
||||
"@babel/preset-env": "^7.12.7",
|
||||
"@hotwired/stimulus": "^3.0.0"
|
||||
},
|
||||
"jest": {
|
||||
"testRegex": "test/.*\\.test.js",
|
||||
"setupFilesAfterEnv": [
|
||||
"./setup.js"
|
||||
]
|
||||
},
|
||||
"files": [
|
||||
"src/",
|
||||
"dist/",
|
||||
"setup.js"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const mountDOM = (htmlString = '') => {
|
||||
module.exports.mountDOM = (htmlString = '') => {
|
||||
const div = document.createElement('div');
|
||||
div.innerHTML = htmlString;
|
||||
document.body.appendChild(div);
|
||||
@@ -17,8 +17,6 @@ const mountDOM = (htmlString = '') => {
|
||||
return div;
|
||||
};
|
||||
|
||||
const clearDOM = () => {
|
||||
module.exports.clearDOM = () => {
|
||||
document.body.innerHTML = '';
|
||||
};
|
||||
|
||||
export { clearDOM, mountDOM };
|
||||
|
||||
@@ -9,6 +9,6 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'mutationobserver-shim';
|
||||
import 'regenerator-runtime/runtime.js';
|
||||
import '@testing-library/jest-dom';
|
||||
require('mutationobserver-shim');
|
||||
require('regenerator-runtime/runtime.js');
|
||||
require('@testing-library/jest-dom');
|
||||
|
||||
47
test/controller.test.js
Normal file
47
test/controller.test.js
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import { Application, Controller } from '@hotwired/stimulus';
|
||||
import { getByTestId, waitFor } from '@testing-library/dom';
|
||||
import { clearDOM, mountDOM } from '../src/index';
|
||||
|
||||
// Controller used to check the actual controller was properly booted
|
||||
class AppController extends Controller {
|
||||
connect() {
|
||||
this.element.classList.add('connected');
|
||||
}
|
||||
}
|
||||
|
||||
const startStimulus = () => {
|
||||
const application = Application.start();
|
||||
application.register('app', AppController);
|
||||
};
|
||||
|
||||
describe('AppController', () => {
|
||||
let container;
|
||||
|
||||
beforeEach(() => {
|
||||
container = mountDOM(`
|
||||
<div data-testid="app" data-controller="app"></div>
|
||||
`);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
clearDOM();
|
||||
});
|
||||
|
||||
it('connect', async () => {
|
||||
expect(getByTestId(container, 'app')).not.toHaveClass('connected');
|
||||
|
||||
startStimulus();
|
||||
await waitFor(() => expect(getByTestId(container, 'app')).toHaveClass('connected'));
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user