В этом небольшом посте мы будем тестировать новую функцию nodeJS 18.
Node.js 18 будет переведен на долгосрочную поддержку (LTS) в октябре 2022 года.

В выпуске Node.js 18 я расскажу о некоторых новых функциях.

Захватывающие новые функции включают в себя:

  • Экспериментальный выбор
  • Тестовый бегун
  • Улучшения модулей ECMAScript
  • Улучшена поддержка AbortController и AbortSignal.
  • Обновленная поддержка платформы

Среди прочих особенностей.

Сегодня мы собираемся сделать несколько примеров с тестированием, где мы также будем поверхностно тестировать fetch, Array.findLast и Array.findLastIndex.

Вы можете получить весь код из этого репозитория

Начиная

Итак, давайте создадим наш package.json с помощью команды:

npm init -y

Помните, что вы должны установить версию 18 узла с официальной страницы

Теперь мы собираемся создать файл, который будет index.js, где мы собираемся начать писать наши тесты.

Для начала давайте посмотрим, что нам нужно импортировать:

import test from "node:test";
import assert from "node:assert";

Мы видим, что у нас есть 2 API, которые должны иметь префикс node:, иначе он не будет работать для вас.

После импорта мы можем написать наш первый тест.

Протестируйте строку:

test("Testing a string", () => {
   assert.match("Welcome Node 18", /Node 18/);
});

Этот тест даст нам следующий результат:

ok 1 - Testing a string
  ---
  duration_ms: 0.000385918
  ...

Сначала мы будем использовать метод тестов, который получает описание в качестве первого параметра и обратный вызов в качестве второго параметра, который будет иметь логику нашего теста, или мы можем даже выполнить подтест, как указано в официальной документации.

Чтобы подтвердить строку, мы должны передать строку, которую мы хотим проверить, в качестве первого параметра, а в качестве второго параметра мы отправляем регулярное выражение, как мы видели в предыдущем коде.

Мы также можем отправить третий параметр, который является необязательным, но будет использоваться в качестве пользовательского сообщения об ошибке. Давайте посмотрим на пример:

test("Testing a string fails", () => {
   assert.match("Hello", /world/, 'This string does not contain "world"');
});

Этот тест даст нам следующий результат:

❯node index.test.js 
not ok 1 - Testing a string fails
  duration_ms: 0.000888784
  failureType: 'testCodeFailure'
  error: 'This string not contains "world"'
  code: ERR_ASSERTION
  stack: |-
    TestContext.<anonymous> (file:///Users/jordandev/Desktop/node18/index.test.js:5:10)
    Test.runInAsyncScope (node:async_hooks:202:9)
    Test.run (node:internal/test_runner/test:333:20)
    Test.start (node:internal/test_runner/test:287:17)
    Test.test (node:internal/test_runner/harness:126:18)
    file:///Users/jordandev/Desktop/node18/index.test.js:4:1
    ModuleJob.run (node:internal/modules/esm/module_job:198:25)
    async Promise.all (index 0)
    async ESMLoader.import (node:internal/modules/esm/loader:409:24)
    async loadESM (node:internal/process/esm_loader:85:5)
  ...
  tests 1
  pass 0
  fail 1
  skipped 0
  todo 0
  duration_ms 0.062970366

Как вы можете видеть в ошибке, появляется наша пользовательская ошибка.

равный и неравный

Теперь мы увидим методы equal и notEqual, которые позволят нам проверить 2 значения, чтобы узнать, равны они или нет:

test("Testing that a number is equal", () => {
   let current = 99;
   let expected = 99;
   assert.equal(actual, expected);
});
test("Testing that a number is not equal", () => {
   let current = 22;
   let expected = 393;
   assert.notEqual(actual, expected, `${actual} is not equal to ${expected}`);
});

Как видите, 2 получают текущее значение в качестве первого параметра и ожидаемое значение в качестве второго параметра.

Не забудьте запустить тест с

node index.js

DeepStrictEqual

Мы собираемся протестировать объект, для этого мы будем использовать метод deepStrictEqual, который поможет нам глубоко протестировать свойства нашего объекта:

test("Testing objects", () => {
   assert.deepStrictEqual(
     { name: "jordan" },
     { name: "jordan" },
     "Objects are not equal"
   );
});

Тестирование асинхронной функциональности

Чтобы протестировать асинхронную функцию, нам нужно использовать только асинхронный обратный вызов, и таким образом мы можем использовать await, чтобы иметь возможность разрешать промисы:

test("Testing asynchronous functionality", async() => {
   const number = await Promise.resolve(90);
   assert.equal(number, 90, "The number is not equal to 90");
});

Array.findLast и Array.findLastIndex

Теперь мы собираемся попробовать метод Array.findLast, что мы будем делать, это создавать массив чисел от 1 до 10, и мы будем искать последнее кратное 3, и в результате мы должны получить 9

test("Array.findLast", () => {
     constant numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
     const lastmultipleofthree = numbers.findlast((n) => n % 3 === 0);
     assert.equal(lastMultipleOfThree, 9);
});

Метод findLast похож по синтаксису на фильтр, но возвращает последний найденный элемент.

Теперь мы увидим работу метода Array.findLastIndex, у нас будет массив с повторяющимися числами и мы будем искать последний индекс элемента который равен 3, в данном случае он должен быть 9 по массиву который мы перейдем к нему.

test("Array.findLastIndex", () => {
   const numbers = [1, 3, 2, 4, 4, 3, 4, 1, 9, 3];
   const lastIndexOfThree = numbers.findLastIndex((n) => n === 3);
   assert.equal(lastIndexOfThree, 9);
});

Это работает аналогично findIndex, но возвращает последний найденный индекс элемента на основе условия.

Принести

Теперь мы попробуем одну из моих любимых функций — выборку.

Сделаем вызов конечной точки API jsonplaceholder https://jsonplaceholder.typicode.com/users/1

test("Fetch", async() => {
   const reponse = await fetch("https://jsonplaceholder.typicode.com/users/1");
   const json = await response.json();
   assert.equal(json.name, "Leanne Graham");
});

Как мы видим, у нас есть функция выборки точно так же, как и в браузере.

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

Подтесты

Наконец, мы собираемся сделать подтест, чтобы у вас был пример того, как это сделать:

test("top level test", async (t) => {
   await t.test("subtest 1", (t) => {
     assert.strictEqual(1, 1);
   });
   await t.test("subtest 2", (t) => {
     assert.strictEqual(2, 2);
   });
});

Этот пример предлагается официальной документацией nodejs. Как видите, очень легко провести цепочку тестов через параметр, который дает вам обратный вызов.

Итак, прояснив это, вы можете опробовать новый узел. Лично мне очень понравилось, что они включают API теста и узла.

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

Если вы хотите узнать больше об этом обновлении, вы можете увидеть его в официальном блоге здесь