Использование отладчика Node в тестах Jest

Если вы когда-нибудь сидите со мной на уроке или в паре, вы можете услышать, как я говорю ученику, чтобы он прекратил использовать console.log() в процессе отладки React и вместо этого полагался на debugger через свои инструменты Chrome DevTools. Для этого есть веская причина. console.log обычно позволяет задать один вопрос о вашем коде: «Что это сейчас такое?».

debugger, с другой стороны, позволяет задавать много вопросов; «Каково состояние моего компонента прямо сейчас?», «Мои локальные переменные такие, как я думаю?», «Правильно ли передается это событие клика в мой обработчик событий?»

Как правило, когда вы переходите на использование debugger, вы можете быстрее работать в процессе разработки React, потому что вы можете собирать больше точек данных о том, что происходит. Информация - это сила.

Однако, когда мы пишем тесты, наш код внезапно перестает работать в браузере, и мы теряем доступ к нашему стандартному отладчику. Особенно когда вы новичок, это расстраивает, так как вы хотели бы иметь возможность использовать те же инструменты для отладки тестов, что и рабочий код.

К счастью, есть способ сделать это!

Открытие Chrome Inspector

Во-первых, нам нужно открыть инспектор узлов. Вы можете использовать любую из нескольких технологий для подключения к инспектору Node.js, но, поскольку я уже упоминал об использовании Chrome DevTools, давайте воспользуемся этим. Вы можете открыть инспектор, перейдя к chrome://inspect в браузере Chrome. Это должно привести вас к окну, которое выглядит следующим образом:

Щелкните ссылку Open dedicated DevTools for Node, и вам будут доступны инструменты DevTools, с которыми вы знакомы по реакции разработки.

Отладка некоторых тестов

Нам понадобится код для отладки. Вы можете использовать любой набор тестов Jest, как я собираюсь здесь, но если вы хотите продолжить, не стесняйтесь использовать этот репозиторий, минимальную реализацию Tic-Tac-Toe, которую я создал.

Нам нужно указать Node запустить Jest с включенным агентом инспектора, что можно выполнить с помощью флага --inspect. Кроме того, мы должны указать Jest запускать тесты последовательно, а не в пуле, чтобы мы могли быть уверены, что тесты выполняются в ожидаемом нами порядке. Это можно сделать, запустив Jest с флагом --runInBand.

Если вы используете пример репозитория, вы можете увидеть, что я добавил все это как сценарий npm, testDebug в package.json:

{ 
  "name": "jesting", 
  "version": "1.0.0", 
  "description": "Test module for writing a variety of jest tests", 
  "main": "index.js", 
  "scripts": { 
    "test": "jest", 
    "testDebug": "node --inspect node_modules/.bin/jest --runInBand" 
  }, 
  "author": "Will Mitchell <[email protected]>", 
  "license": "ISC", 
  "devDependencies": { 
    "babel-plugin-transform-class-properties": "^6.24.1", 
    "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", 
    "babel-preset-env": "^1.7.0", 
    "jest": "^23.5.0" 
  }, 
  "dependencies": { "react": "^16.4.2" } 
}

Теперь, когда я запускаю тесты с новым скриптом, он будет уважать любые debugger команды, с которыми он столкнется, и мы сможем задавать вопросы о нашем коде в инспекторе.

Кроме того, я могу разместить свои debugger операторы либо в тестах, либо в моем коде, он остановит выполнение в обоих местах. Если вы пытаетесь определить, почему конкретный тест не работает должным образом, это может быть особенно полезно:

// index.js 
checkRowWinner = () => { 
  const xWins = this.board.some(row => row.every(cell => cell === 'X')) 
  const oWins = this.board.some(row => row.every(cell => cell === 'O')) 
  debugger 
  if(xWins) { 
    return 'X' 
  } else if(oWins) { 
    return 'O' 
  } 
}
// index.test.js 
it.only('knows if there is a row win', () => { 
  game.board = [['X', 'X', 'X'],[null, null, null],[null, null, null]] 
  const expected = 'Game over. X wins!' 
  const result = game.status() 
  debugger 
  expect(result).toEqual(expected) 
})

Последние мысли

Написание тестов не должно быть сложнее, чем написание кода, и принятие этого решения сделает ваш код более надежным, масштабируемым и поддерживаемым. Упростите себе задачу, используя инструменты, с которыми вы уже знакомы.

Удачного взлома!

Первоначально опубликовано на wvmitchell.net 1 сентября 2018 г.