-
Notifications
You must be signed in to change notification settings - Fork 29.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
test_runner: t.after
should respect the first-in-last-out
principle like Golang's defer
#55853
Comments
IMO this code snippet is functioning as intended. The hooks are running in the order they were received. I don't think we should reverse that order, as IMO it'll only cause confusion and breakages. -1 from me |
async function useDatabase(t) {
const db = await connect()
t.before(() => {
// insert initial data
})
t.after(() => {
// close database connection
})
return db
}
test('test', async function(t) {
const db = await useDatabase(t)
// test operation
t.after(() => {
// test cleanup
})
}) Comparison on the Ecosystem. Most of the testing framework using or provides |
I think there is more nuance to this.
I'm not sure if this intended to be a comprehensive comparison, but that is not my take away. Jest alone seems to have more npm downloads than all of the "reverse order" runners combined. I'm not saying we should blindly follow Jest, but it is worth pointing out that both approaches are heavily used.
I'm not sure how accurate this is either. It is definitely one pattern, but may or may not be the most common pattern depending on the application. It's also worth noting that for this to be an issue, you must have multiple Because both approaches are heavily used, I don't think we should break existing I do understand the reasoning for wanting the after hooks to work this way though. I wouldn't be opposed to being able to support both approaches (please not another CLI flag for this!). I think the inherited |
I would like to mention instead of providing both It becomes, async function useDatabase(t) {
const db = await connect()
t.before(() => {
// insert initial data
console.log(1)
return () => {
// cleanup for this particular before hook
console.log(5)
}
})
return db
}
test('test', async function(t) {
const db = await useDatabase(t)
// test operation
console.log(2)
t.after(() => {
// test cleanup
console.log(3)
})
t.after(() => {
// another test cleanup
console.log(4)
})
}) |
@climba03003 that sounds like a good proposal to me! |
Version
v22.10.0
Platform
No response
Subsystem
No response
What steps will reproduce the bug?
1. Create a test file
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 principleAccording to the above code, the file should be deleted first, then the directory
What do you see instead?
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?
The text was updated successfully, but these errors were encountered: