首页 > 解决方案 > 从 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://inspectChrome 时,在相关的 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]);
});

标签: javascriptnode.jsgoogle-chromedebuggingjestjs

解决方案


推荐阅读