HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Каждую проверку, которую мы написали для функции capitalize(), в тестировании принято называть<em>утверждением</em>(assert). Утверждения - ключевая часть тестов. Именно они проверяют функциональность кода:</p>
1 <p>Каждую проверку, которую мы написали для функции capitalize(), в тестировании принято называть<em>утверждением</em>(assert). Утверждения - ключевая часть тестов. Именно они проверяют функциональность кода:</p>
2 <p>Можно заметить, что все проверки строятся одинаковым способом: условие =&gt; исключение. Node.js поставляется с модулем<em>assert</em>, в котором есть несколько функций, упрощающих написание утверждений:</p>
2 <p>Можно заметить, что все проверки строятся одинаковым способом: условие =&gt; исключение. Node.js поставляется с модулем<em>assert</em>, в котором есть несколько функций, упрощающих написание утверждений:</p>
3 <p>В самом простом случае<em>assert</em>используется как функция, которая проверяет истинность переданного значения. Другими словами, assert(true) означает, что всё хорошо, а assert(false) говорит об ошибке. Последний вариант выбрасывает исключение с таким сообщением:</p>
3 <p>В самом простом случае<em>assert</em>используется как функция, которая проверяет истинность переданного значения. Другими словами, assert(true) означает, что всё хорошо, а assert(false) говорит об ошибке. Последний вариант выбрасывает исключение с таким сообщением:</p>
4 <p>AssertionError [ERR_ASSERTION]: false == true</p>
4 <p>AssertionError [ERR_ASSERTION]: false == true</p>
5 <p>Расшифровка сообщения: "Ожидалось, что значением выражения будет истина, но оказалось, что это ложь". Кроме сообщения, выводится бектрейс, по которому можно найти сработавшее утверждение:</p>
5 <p>Расшифровка сообщения: "Ожидалось, что значением выражения будет истина, но оказалось, что это ложь". Кроме сообщения, выводится бектрейс, по которому можно найти сработавшее утверждение:</p>
6 <p>Функция assert() сделала наш код короче и проще для восприятия. Положительная проверка смотрится естественнее, так как это то, что мы ожидаем.</p>
6 <p>Функция assert() сделала наш код короче и проще для восприятия. Положительная проверка смотрится естественнее, так как это то, что мы ожидаем.</p>
7 <p>С другой стороны, вывод сообщения об ошибке крайне неинформативный. Единственный способ понять, что произошло - открывать код с упавшим утверждением (ещё есть вариант передать сообщение об ошибке последним параметром, но так не делают, потому что это слишком "ручной" способ, требующий больших усилий). Это пытаются исправить с помощью специализированных утверждений, заточенных под конкретные ситуации. Например, при сравнении двух значений подходит функция assert.strictEqual(actual, expected). Перепишем код выше:</p>
7 <p>С другой стороны, вывод сообщения об ошибке крайне неинформативный. Единственный способ понять, что произошло - открывать код с упавшим утверждением (ещё есть вариант передать сообщение об ошибке последним параметром, но так не делают, потому что это слишком "ручной" способ, требующий больших усилий). Это пытаются исправить с помощью специализированных утверждений, заточенных под конкретные ситуации. Например, при сравнении двух значений подходит функция assert.strictEqual(actual, expected). Перепишем код выше:</p>
8 <p>Вывод таких утверждений значительно понятнее:</p>
8 <p>Вывод таких утверждений значительно понятнее:</p>
9 <p>Thrown: AssertionError [ERR_ASSERTION]: 'hello' == 'Hello' generatedMessage: true, code: 'ERR_ASSERTION', actual: 'hello', expected: 'Hello', operator: '=='</p>
9 <p>Thrown: AssertionError [ERR_ASSERTION]: 'hello' == 'Hello' generatedMessage: true, code: 'ERR_ASSERTION', actual: 'hello', expected: 'Hello', operator: '=='</p>
10 <p>В этом выводе есть не только информация об ошибке, но и данные, которые передавались в утверждение. Такой формат упрощает анализ проблемы и ускоряет отладку.</p>
10 <p>В этом выводе есть не только информация об ошибке, но и данные, которые передавались в утверждение. Такой формат упрощает анализ проблемы и ускоряет отладку.</p>
11 <p>Однако, будьте осторожны. Функция strictEqual(actual, expected) проверяет равенство по ссылке. То есть два разных объекта, имеющих одинаковое содержание, рассматриваются как не эквивалентные:</p>
11 <p>Однако, будьте осторожны. Функция strictEqual(actual, expected) проверяет равенство по ссылке. То есть два разных объекта, имеющих одинаковое содержание, рассматриваются как не эквивалентные:</p>
12 <p>Для сравнения по значению используется ещё одно утверждение: assert.deepEqual(actual, expected). Оно опирается только на содержимое:</p>
12 <p>Для сравнения по значению используется ещё одно утверждение: assert.deepEqual(actual, expected). Оно опирается только на содержимое:</p>
13 <p>На самом деле правила проверки этой функции достаточно сложны. Подробнее об этом можно прочитать в<a>документации</a></p>
13 <p>На самом деле правила проверки этой функции достаточно сложны. Подробнее об этом можно прочитать в<a>документации</a></p>
14 <p>Для тестирования негативных сценариев предназначены функции assert.notStrictEqual(actual, expected) и assert.notDeepStrictEqual(actual, expected). Они тестируют то, что значения не равны. Эти утверждения используются крайне редко, но знать о них всё равно полезно:</p>
14 <p>Для тестирования негативных сценариев предназначены функции assert.notStrictEqual(actual, expected) и assert.notDeepStrictEqual(actual, expected). Они тестируют то, что значения не равны. Эти утверждения используются крайне редко, но знать о них всё равно полезно:</p>
15  
15