test_runner: `t.after` should respect `the first-in-last-out` principle like Golang's defer
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- JavaScript
- Sterne
- 122k
- Forks
- 37.3k
- Ø Merge
- 4 T. 2 Std.
- Gemergte PRs (30 T.)
- 283
Beschreibung
Version
v22.10.0
Platform
No response
Subsystem
No response
What steps will reproduce the bug?
1. Create a test file
import fs from 'node:fs'
import path from 'node:path'
import test from 'node:test'
test('basic', async (t) => {
const testDir = path.join(import.meta.dirname, 'logs')
fs.mkdirSync(testDir, { recursive: true })
t.after(() => {
console.log('remove test dir')
fs.rmdirSync(testDir, { recursive: true })
})
fs.writeFileSync(path.join(testDir, 'test.log'), 'hello world!')
t.after(() => {
console.log('remove test file')
fs.unlinkSync(path.join(testDir, 'test.log'))
})
// do staff...
})
How often does it reproduce? Is there a required condition?
None
What is the expected behavior? Why is that the expected behavior?
t.after should follow the first-in, last-out principle
According to the above code, the file should be deleted first, then the directory
What do you see instead?
✖ basic (7.4021ms)
Error: ENOENT: no such file or directory, unlink 'project\folder\logs\test.log'
at Object.unlinkSync (node:fs:1871:11)
at TestContext.<anonymous> (file:///path/to/test.test.mjs:19:12)
at TestHook.runInAsyncScope (node:async_hooks:211:14)
at TestHook.run (node:internal/test_runner/test:934:25)
at TestHook.run (node:internal/test_runner/test:1225:18)
at TestHook.run (node:internal/util:543:20)
at node:internal/test_runner/test:853:20
at async Test.runHook (node:internal/test_runner/test:851:7)
at async after (node:internal/test_runner/test:893:9)
at async Test.run (node:internal/test_runner/test:942:7) {
Additional information
the first-in-last-out principle is more reasonable and practical. It is useful in many scenarios.
I'm not sure why it was designed in the form of a queue. Is there anything special about it?
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Reproduziere das Verhalten mit dem bereitgestellten Testfall und verfolge dann die Bereinigung anhand der Stack Frames von node:internal/test_runner, insbesondere TestHook.run und after. Die Aufgabe ist erledigt, wenn Callbacks in umgekehrter Registrierungsreihenfolge ausgeführt werden, sodass die Datei vor ihrem Verzeichnis entfernt wird, mit Abdeckung für die gemeldete Reihenfolge.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- javascript, node.js
- Bereich
- testing-qa
- Issue-Typ
- Bug
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Aktivitätsstatus
- Ruhig
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 55/100