test_runner: `t.after` should respect `the first-in-last-out` principle like Golang's defer
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- JavaScript
- Star
- 122k
- Fork
- 37.3k
- Merge trung bình
- 4 ngày 2 giờ
- Pull request đã merge (30 ngày)
- 283
Mô tả
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?
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Tái hiện hành vi bằng test case được cung cấp, sau đó lần theo quá trình dọn dẹp từ các stack frame của node:internal/test_runner, đặc biệt là TestHook.run và after. Hoàn tất khi các callback được thực thi theo thứ tự ngược với thứ tự đăng ký, để file được xóa trước directory của nó, với coverage cho thứ tự đã được báo cáo.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- javascript, node.js
- Lĩnh vực
- testing-qa
- Loại issue
- Lỗi
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức độ hoạt động
- Ít trao đổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 55/100