测试用例在 deno 上泄漏异步操作
Test case is leaking async ops on deno
我从 Drash 下载示例应用程序 (https://github.com/drashland/deno-drash)
$ deno run --allow-run --allow-read --allow-write --allow-net https://deno.land/x/drash/create_app.ts --api
并尝试添加一个新测试,其中:
- 将获取 GET /
- 断言状态代码和响应json
Deno.test("HomeResource - GET /", async () => {
const response = await fetch("http://localhost:1557", {
method: "GET",
});
assertEquals(response.status, 200);
assertEquals(
await response.json(),
JSON.stringify({
success: true,
message: "GET request received.",
}),
);
});
这是错误信息
Server listening: http://localhost:1557
running 5 tests
test HomeResource - GET / ... FAILED (9ms)
test HomeResource - POST / ... ok (2ms)
test HomeResource - PUT / ... ok (2ms)
test HomeResource - DELETE / ... ok (2ms)
Stop the server ... ok (0ms)
failures:
HomeResource - GET /
AssertionError: Test case is leaking async ops.
Before:
- dispatched: 1
- completed: 0
After:
- dispatched: 9
- completed: 7
Make sure to await all promises returned from Deno APIs before
finishing test case.
at assert (rt/06_util.js:33:13)
at asyncOpSanitizer (rt/40_testing.js:44:7)
at async Object.resourceSanitizer [as fn] (rt/40_testing.js:68:7)
at async TestRunner.[Symbol.asyncIterator] (rt/40_testing.js:240:13)
at async Object.runTests (rt/40_testing.js:317:22)
failures:
HomeResource - GET /
test result: FAILED. 4 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out (15ms)
我试过取消正文
response.body?.cancel()
,但表示流已锁定。
测试:https://github.com/ramonmedeiros/learning_deno/blob/master/tests/resources/home_resource_test.ts
测试用例正在泄漏操作和资源。也许 Drash 没有正确处理这个问题。
这些是获取请求前后的资源-
┌───────┬───────────────┐
│ (idx) │ Values │
├───────┼───────────────┤
│ 0 │ "stdin" │
│ 1 │ "stdout" │
│ 2 │ "stderr" │
│ 3 │ "tcpListener" │
└───────┴───────────────┘
┌───────┬───────────────┐
│ (idx) │ Values │
├───────┼───────────────┤
│ 0 │ "stdin" │
│ 1 │ "stdout" │
│ 2 │ "stderr" │
│ 3 │ "tcpListener" │
│ 4 │ "tcpStream" │
└───────┴───────────────┘
这些是获取请求前后的操作-
┌─────────────────────────┬────────┐
│ (idx) │ Values │
├─────────────────────────┼────────┤
│ opsDispatched │ 5 │
│ opsDispatchedSync │ 4 │
│ opsDispatchedAsync │ 1 │
│ opsDispatchedAsyncUnref │ 0 │
│ opsCompleted │ 4 │
│ opsCompletedSync │ 4 │
│ opsCompletedAsync │ 0 │
│ opsCompletedAsyncUnref │ 0 │
│ bytesSentControl │ 121 │
│ bytesSentData │ 46 │
│ bytesReceived │ 418 │
└─────────────────────────┴────────┘
┌─────────────────────────┬────────┐
│ (idx) │ Values │
├─────────────────────────┼────────┤
│ opsDispatched │ 14 │
│ opsDispatchedSync │ 6 │
│ opsDispatchedAsync │ 8 │
│ opsDispatchedAsyncUnref │ 0 │
│ opsCompleted │ 12 │
│ opsCompletedSync │ 6 │
│ opsCompletedAsync │ 6 │
│ opsCompletedAsyncUnref │ 0 │
│ bytesSentControl │ 323 │
│ bytesSentData │ 73903 │
│ bytesReceived │ 1060 │
└─────────────────────────┴────────┘
tcpStream
资源测试后没有关闭。
请参阅 opsDispatchedAsync
和 opsCompletedAsync
。所有的异步操作都没有完成。
如前所述,这是异步操作和资源清理 here。默认情况下启用这些,但可以通过将 sanitizeResources
和 sanitizeOps
设置为 false
来禁用,如上一个测试用例 -
Deno.test({
name: "\b\b\b\b\b \nStop the server",
fn() {
server.close();
},
sanitizeResources: false,
sanitizeOps: false,
});
我从 Drash 下载示例应用程序 (https://github.com/drashland/deno-drash)
$ deno run --allow-run --allow-read --allow-write --allow-net https://deno.land/x/drash/create_app.ts --api
并尝试添加一个新测试,其中:
- 将获取 GET /
- 断言状态代码和响应json
Deno.test("HomeResource - GET /", async () => {
const response = await fetch("http://localhost:1557", {
method: "GET",
});
assertEquals(response.status, 200);
assertEquals(
await response.json(),
JSON.stringify({
success: true,
message: "GET request received.",
}),
);
});
这是错误信息
Server listening: http://localhost:1557
running 5 tests
test HomeResource - GET / ... FAILED (9ms)
test HomeResource - POST / ... ok (2ms)
test HomeResource - PUT / ... ok (2ms)
test HomeResource - DELETE / ... ok (2ms)
Stop the server ... ok (0ms)
failures:
HomeResource - GET /
AssertionError: Test case is leaking async ops.
Before:
- dispatched: 1
- completed: 0
After:
- dispatched: 9
- completed: 7
Make sure to await all promises returned from Deno APIs before
finishing test case.
at assert (rt/06_util.js:33:13)
at asyncOpSanitizer (rt/40_testing.js:44:7)
at async Object.resourceSanitizer [as fn] (rt/40_testing.js:68:7)
at async TestRunner.[Symbol.asyncIterator] (rt/40_testing.js:240:13)
at async Object.runTests (rt/40_testing.js:317:22)
failures:
HomeResource - GET /
test result: FAILED. 4 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out (15ms)
我试过取消正文
response.body?.cancel()
,但表示流已锁定。
测试:https://github.com/ramonmedeiros/learning_deno/blob/master/tests/resources/home_resource_test.ts
测试用例正在泄漏操作和资源。也许 Drash 没有正确处理这个问题。
这些是获取请求前后的资源-
┌───────┬───────────────┐
│ (idx) │ Values │
├───────┼───────────────┤
│ 0 │ "stdin" │
│ 1 │ "stdout" │
│ 2 │ "stderr" │
│ 3 │ "tcpListener" │
└───────┴───────────────┘
┌───────┬───────────────┐
│ (idx) │ Values │
├───────┼───────────────┤
│ 0 │ "stdin" │
│ 1 │ "stdout" │
│ 2 │ "stderr" │
│ 3 │ "tcpListener" │
│ 4 │ "tcpStream" │
└───────┴───────────────┘
这些是获取请求前后的操作-
┌─────────────────────────┬────────┐
│ (idx) │ Values │
├─────────────────────────┼────────┤
│ opsDispatched │ 5 │
│ opsDispatchedSync │ 4 │
│ opsDispatchedAsync │ 1 │
│ opsDispatchedAsyncUnref │ 0 │
│ opsCompleted │ 4 │
│ opsCompletedSync │ 4 │
│ opsCompletedAsync │ 0 │
│ opsCompletedAsyncUnref │ 0 │
│ bytesSentControl │ 121 │
│ bytesSentData │ 46 │
│ bytesReceived │ 418 │
└─────────────────────────┴────────┘
┌─────────────────────────┬────────┐
│ (idx) │ Values │
├─────────────────────────┼────────┤
│ opsDispatched │ 14 │
│ opsDispatchedSync │ 6 │
│ opsDispatchedAsync │ 8 │
│ opsDispatchedAsyncUnref │ 0 │
│ opsCompleted │ 12 │
│ opsCompletedSync │ 6 │
│ opsCompletedAsync │ 6 │
│ opsCompletedAsyncUnref │ 0 │
│ bytesSentControl │ 323 │
│ bytesSentData │ 73903 │
│ bytesReceived │ 1060 │
└─────────────────────────┴────────┘
tcpStream
资源测试后没有关闭。
请参阅 opsDispatchedAsync
和 opsCompletedAsync
。所有的异步操作都没有完成。
如前所述,这是异步操作和资源清理 here。默认情况下启用这些,但可以通过将 sanitizeResources
和 sanitizeOps
设置为 false
来禁用,如上一个测试用例 -
Deno.test({
name: "\b\b\b\b\b \nStop the server",
fn() {
server.close();
},
sanitizeResources: false,
sanitizeOps: false,
});