Supply AbortController signal to tests
- Dominant language
- JavaScript
- Stars
- 736
- Forks
- 177
- PR merge metrics
- No merged PRs in 30d
Description
#### Support plan
* *is this issue currently blocking your project?* (yes/no): no
* *is this issue affecting a production system?* (yes/no): no
#### Context
* *node version*: 14+
* *module version*: 24.3.2
* *environment* (e.g. node, browser, native): node 14+
* *used with* (e.g. hapi application, another framework, standalone, ...):
* *any other relevant information*:
#### What problem are you trying to solve?
Simpler cleanup of failed (or time outed) tests.
#### Do you have a new or modified API suggestion to solve the problem?
Add an `AbortController` `signal` property to the `flags` parameter. This way a test can pass it on, eg.:
```js
it('performs a fetch', async ({ signal }) => {
const req = http.request('http://example.org', { signal });
const [res] = await Events.onceee(req, 'response'); // Crashes since `onceee` does not exist.
expect(res.statusCode).to.equal(200);
});
```
Without the `signal`, the code crashes before any event emitters are added, which obviously causes the test to fail. However, the request continues processing. If it errors at any point, it will cause a process `uncaughtException`, which will cause whatever subsequent test that is running to fail.
With the `signal`, which lab should trigger at the same time as calling `onCleanup`, it will be guaranteed to cause a process `uncaughtException`, but this time it should be an immediate `AbortError` which can be ignored, causing no further harm. This is on top of the obvious effect of aborting the no longer relevant request.
Note: This feature overlaps with the existing `onCleanup` flag. Any code using non-async `onCleanup`, can assign the logic as an event listener:
```js
it('does something', async ({ signal }) => {
signal.addEventListener('abort', () => {
/* onCleanup logic goes here */
});
// or even simpler
signal.onabort = () => {
/* onCleanup logic goes here */
};
});
```
Contributor guide
Assessment
This issue has not been assessed yet.