coverage testing blocked by promise should report where that promise came from
まだ誰も着手していません。
- 主要言語
- JavaScript
- スター
- 122k
- フォーク
- 37.3k
- 平均マージ
- 4日 2時間
- マージ済み PR(30日)
- 283
説明
Version
24.8.0
Platform
macos sequioa
Subsystem
test runner
What steps will reproduce the bug?
create any dir and put a test.js file in it with content:
import test, { describe } from "node:test";
import assert from "node:assert/strict";
describe(`project testing`, async () => {
test(`this'll hang`, async () => {
const value = await new Promise((resolve) => {
console.log(`looks like this'll never resolve()`);
});
assert.equal(value, true);
});
});
Then run this with node --test "test.js"
Obviously this'll never finish, so hit ctrl-c, which triggers the final report and shows:
^C✖ test.js (1376.646ms)
ℹ tests 1
ℹ suites 0
ℹ pass 0
ℹ fail 0
ℹ cancelled 1
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1379.56475
✖ failing tests:
test at test.js:1:1
✖ test.js (1376.646ms)
'Promise resolution is still pending but the event loop has already resolved'
And, sure: that's true... but this message also isn't information, because it tells us nothing that lets us fix the problem.
Which promise is still pending? Which file, line, and column and the promise invocation be found on? Because Node knows where promise call sites are, and it should include that information in the error report.
How often does it reproduce? Is there a required condition?
This is how things work right now.
What is the expected behavior? Why is that the expected behavior?
The error should be:
test at test.js:6:18
✖ test.js (1598.681125ms)
'Promise resolution is still pending but the event loop has already resolved'
explicitly showing the line things went wrong on.
And if there is a promise pending because of some dependency of a dependency, it should show that entire trace: if test.js is awaiting getInfo() imported from ./utils.js and that calls getNetworkDeviceNames() imported from ./utils/network.js and that has a promise that never resolves, then this error should let folks find that problem:
test at test.js:6:18
at utils.js:20:14
at utils/network.js:112:25
✖ test.js (1598.681125ms)
'Promise resolution is still pending but the event loop has already resolved'
Or however traces should be made to look for this functionality. The important part is that it's informative so that we can fix bugs. After all, that's the whole point of using node --test =)
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
説明されている test.js と node --test "test.js" で動作を再現し、そこから test runner による pending-promise レポートの処理を起点にしてください。promise の呼び出し箇所と依存する非同期呼び出しがどのように表現されているかを追跡し、元の場所と関連する依存関係のトレースを含むように出力を定義してください。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- javascript
- 領域
- testing
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 静か
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 45/100