javascript - 从 Jest 单元测试输入时,Chrome 调试器无响应?
问题描述
我正在为 Node 中的算法问题编写解决方案,并希望从 Jest 单元测试中进入调试器。所以我在一个debugger;
被调用的函数中写了一个语句,然后按照https://jestjs.io/docs/en/troubleshooting运行
$ node --inspect-brk node_modules/.bin/jest --runInBand
Debugger listening on ws://127.0.0.1:9229/708dd374-d8ac-47ca-a62b-5ecfe7b0fbf6
For help, see: https://nodejs.org/en/docs/inspector
然后当我进入chrome://inspect
Chrome 时,在相关的 Node 进程上单击“检查”,然后按 F8,我看到调试器跟踪被命中,但我无法在控制台中执行命令:
在上面的屏幕中,当我按“Enter”时,没有任何反应。如果我回头查看启动调试命令的窗口,我会看到发生了错误:
RUNS ./simpleQueries.test.js
1: 0x100037733 node::Abort() [/usr/local/bin/node]
2: 0x100093eff node::BackgroundTaskRunner::PostDelayedTask(std::__1::unique_ptr<v8::Task, std::__1::default_delete<v8::Task> >, double) [/usr/local/bin/node]
3: 0x100175b99 v8_inspector::V8InspectorImpl::EvaluateScope::setTimeout(double) [/usr/local/bin/node]
4: 0x10016977d v8_inspector::V8DebuggerAgentImpl::evaluateOnCallFrame(v8_inspector::String16 const&, v8_inspector::String16 const&, v8_inspector::protocol::Maybe<v8_inspector::String16>, v8_inspector::protocol::Maybe<bool>, v8_inspector::protocol::Maybe<bool>, v8_inspector::protocol::Maybe<bool>, v8_inspector::protocol::Maybe<bool>, v8_inspector::protocol::Maybe<bool>, v8_inspector::protocol::Maybe<double>, std::__1::unique_ptr<v8_inspector::protocol::Runtime::RemoteObject, std::__1::default_delete<v8_inspector::protocol::Runtime::RemoteObject> >*, v8_inspector::protocol::Maybe<v8_inspector::protocol::Runtime::ExceptionDetails>*) [/usr/local/bin/node]
5: 0x10012681d v8_inspector::protocol::Debugger::DispatcherImpl::evaluateOnCallFrame(int, std::__1::unique_ptr<v8_inspector::protocol::DictionaryValue, std::__1::default_delete<v8_inspector::protocol::DictionaryValue> >, v8_inspector::protocol::ErrorSupport*) [/usr/local/bin/node]
6: 0x100125c41 v8_inspector::protocol::Debugger::DispatcherImpl::dispatch(int, v8_inspector::String16 const&, std::__1::unique_ptr<v8_inspector::protocol::DictionaryValue, std::__1::default_delete<v8_inspector::protocol::DictionaryValue> >) [/usr/local/bin/node]
7: 0x10011a332 v8_inspector::protocol::UberDispatcher::dispatch(std::__1::unique_ptr<v8_inspector::protocol::Value, std::__1::default_delete<v8_inspector::protocol::Value> >, int*, v8_inspector::String16*) [/usr/local/bin/node]
8: 0x100178b7d v8_inspector::V8InspectorSessionImpl::dispatchProtocolMessage(v8_inspector::StringView const&) [/usr/local/bin/node]
9: 0x1000e1f1d node::inspector::NodeInspectorClient::dispatchMessageFromFrontend(int, v8_inspector::StringView const&) [/usr/local/bin/node]
10: 0x1000e1ca8 node::inspector::(anonymous namespace)::SameThreadInspectorSession::Dispatch(v8_inspector::StringView const&) [/usr/local/bin/node]
11: 0x1000ede08 void node::inspector::(anonymous namespace)::AnotherThreadObjectReference<node::inspector::(anonymous namespace)::MainThreadSessionState>::Apply<std::__1::unique_ptr<v8_inspector::StringBuffer, std::__1::default_delete<v8_inspector::StringBuffer> > >(node::inspector::(anonymous namespace)::MainThreadSessionState*, void (node::inspector::(anonymous namespace)::MainThreadSessionState::*)(std::__1::unique_ptr<v8_inspector::StringBuffer, std::__1::default_delete<v8_inspector::StringBuffer> >), std::__1::unique_ptr<v8_inspector::StringBuffer, std::__1::default_delete<v8_inspector::StringBuffer> >&) [/usr/local/bin/node]
12: 0x1000ecc7b node::inspector::MainThreadInterface::DispatchMessages() [/usr/local/bin/node]
13: 0x100094c6b node::PerIsolatePlatformData::RunForegroundTask(std::__1::unique_ptr<v8::Task, std::__1::default_delete<v8::Task> >) [/usr/local/bin/node]
14: 0x100094364 node::PerIsolatePlatformData::FlushForegroundTasksInternal() [/usr/local/bin/node]
15: 0x1000950e5 node::NodePlatform::FlushForegroundTasks(v8::Isolate*) [/usr/local/bin/node]
16: 0x1000e1501 node::inspector::NodeInspectorClient::runMessageLoop() [/usr/local/bin/node]
17: 0x10015c3e1 v8_inspector::V8Debugger::handleProgramBreak(v8::Local<v8::Context>, v8::Local<v8::Value>, std::__1::vector<int, std::__1::allocator<int> > const&, bool, bool) [/usr/local/bin/node]
18: 0x1003e3c28 v8::internal::Debug::OnDebugBreak(v8::internal::Handle<v8::internal::FixedArray>) [/usr/local/bin/node]
19: 0x1003e9264 v8::internal::Debug::HandleDebugBreak(v8::internal::IgnoreBreakMode) [/usr/local/bin/node]
20: 0x100612a61 v8::internal::Runtime_HandleDebuggerStatement(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/local/bin/node]
21: 0xb3e2bdc01d
Abort trap: 6
但是,我不确定如何处理错误日志。知道问题可能在这里吗?
作为参考,以下是我要测试的功能(simpleQueries.js
):
function countsSorted(nums, maxes) {
// Count the numer of elements in 'nums' less than or equal to
// each element of 'maxes' in O(n + m) time, assuming that
// 'nums' and 'maxes' are sorted
let i = 0;
const result = new Array(maxes.length);
let prev = 0;
for (let j = 0; j < maxes.length; j += 1) {
result[j] = prev;
while (i < nums.length && nums[i] <= maxes[j]) {
result[j] += 1;
i += 1;
}
prev = result[j];
}
return result;
}
function getSortIndices(arr) {
// Return an array mapping indices of 'arr' to their sorted positions
return arr.map((value, index) => [value, index])
.sort((a, b) => (a[0] < b[0] ? -1 : 1))
.map(value => value[1]);
}
function unsort(arr, sortIndices) {
// 'Unsort' a sorted array back to its original order
const result = new Array(arr.length);
for (let i = 0; i < arr.length; i += 1) {
result[sortIndices[i]] = arr[i];
}
return result;
}
function counts(nums, maxes) {
// Count the number of elements in 'nums' less than or equal to
// each element of 'maxes' in O(m log m + n log n) time
debugger;
return unsort(
countsSorted([...nums].sort(), [...maxes].sort()),
getSortIndices(maxes),
);
}
function countsBruteForce(nums, maxes) {
const result = new Array(maxes.length);
for (let i = 0; i < maxes.length; i += 1) {
result[i] = 0;
for (let j = 0; j < nums.length; j += 1) {
if (nums[j] <= maxes[i]) result[i] += 1;
}
}
return result;
}
module.exports = {
countsSorted, getSortIndices, unsort, counts, countsBruteForce,
};
以下是 Jest 单元测试simpleQueries.test.js
:
const simpleQueries = require('./simpleQueries');
test('gets the right sorted indices', () => {
expect(simpleQueries.getSortIndices([1, 3, 2])).toEqual([0, 2, 1]);
});
test('unsorts to the original array', () => {
expect(simpleQueries.unsort([1, 2, 3], [0, 2, 1])).toEqual([1, 3, 2]);
});
test('gets counts for sorted nums', () => {
expect(simpleQueries.countsSorted([1, 2, 4, 4], [3, 5])).toEqual([2, 4]);
});
test('gets counts for sorted nums with actual function', () => {
expect(simpleQueries.counts([1, 2, 4, 4], [3, 5])).toEqual([2, 4]);
});
test('does not mutate inputs', () => {
const nums = [1, 2, 3, 4, 3];
const maxes = [3, 5];
simpleQueries.counts(nums, maxes);
expect(nums).toEqual([1, 2, 3, 4, 3]);
expect(maxes).toEqual([3, 5]);
});
test('counts by brute force', () => {
expect(simpleQueries.countsBruteForce([1, 4, 2, 4], [5, 3])).toEqual([4, 2]);
});
test('matches brute force result', () => {
const nums = [1, 8, 7, 6, 4, 0, 2, 3, 9, 8];
const maxes = [9, 7, 3, 5, 2, 7];
expect(simpleQueries.counts(nums, maxes)).toEqual(simpleQueries.countsBruteForce(nums, maxes));
});
test('passes test case 2', () => {
const nums = [2, 10, 5, 4, 8];
const maxes = [3, 1, 7, 8];
expect(simpleQueries.counts(nums, maxes)).toEqual([1, 0, 3, 4]);
});
解决方案
推荐阅读
- java - Android Studio codestyles/Project.xml 配置
- reactjs - 反应功能组件 setState 不更新状态
- c++ - C++ 错误:'operator<<' 不匹配(操作数类型是 'std::istream {aka std::basic_istream}' 和 'int')
- sass - 使用 rollup.js 编译单个 SCSS 文件
- html - 为什么我的有填充我没有应用?
- javascript - Javascript中的“(_,i)=>表达式”是什么意思?
- python - 熊猫仅在数据框中的特定时间之间合并股票数据
- mongodb - Unable to connect to MongoDB Atlas Cluster with MongoDB.Driver: 无法连接,因为目标机器主动拒绝
- html - 将 css 样式设置为一个特定页面的正文,该页面共享一个公共 header.ejs 文件
- python - 努力制作一个程序,该程序的变量在 Python 上按下按钮时会发生变化