Рубрики
Без рубрики

Как проверить приложение Socket.IO-клиента с помощью шума и библиотеки реагирования

Справедливость MBA, как проверить приложение Socket.iO-клиента с использованием шума и библиотеки реагирования – библиотеки по реагированию – библиотеки FreeStocks на безразличном качеством интеграции в реальном времени. долгая история проблем свидетельств. Давайте исправить это! Быстро Google “Тестирование

Справедливость MBA

Тестирование качества интеграции в реальном времени. Интеграция Socket.io-клиенты, по-видимому, взимается в забвение, может быть, потому что УИ, имел долгую историю проблем свидетельств. Давайте исправить это!

Быстро Google “Тестирование socket.io приложение”.

Первые два страницы результата (просто не надо надоедать остальные страницы) – это все примеры и учебные пособия, ориентируясь на тестирование серверов Socket.io Integration. Никто не говорит о качестве интеграции Socket.iO-клиентской интеграции на интерфейс, как пользовательский интерфейс будет выглядеть, когда он получает определенные события, и если передний код фактически выделяет правильные события.

Но почему? То есть ли это означает, что люди действительно не заботятся о качестве их приложений в режиме реального времени на фронт-конце – мясо программного обеспечения? Я так не думаю. Мое предположение: тестирование UIS был Слишком сильно!

Пользовательские интерфейсы имели долгую историю проблем свидетельств. УИ, никогда не стабильны. Инструменты тестирования, которые мы доступны нам, легко приведут к написанию очень хрупких тестов UI. Таким образом, люди имеют тенденцию сосредоточить свое время и энергию на тестирование своих приложений Socket.io только на стороне сервера.

Но это не чувствует себя правильно. Это Только UI, который заставляет наш пользователь уверен, что они на самом деле выполняют цель использования нашего приложения. Но потом до нас родился инструмент тестирования пользовательского интерфейса!

Реагистрационная тестирование-библиотека

Это было несколько месяцев назад, что мой друг и наставник Кент C. Додс Выпустил этот красивый инструмент Для тестирования реагированных приложений. С тех пор я больше не просто люблю Идея Тестирования УИН, но на самом деле любить тестирование их. Я буквально выкопал и проверил весь код UI, который я отказался от тестирования из-за его сложности:).

По моему мнению, основанное на опыте мнения, библиотека React-Testing – это Panacea для всех проблем тестовых пользовательских интерфейсов. Это не просто тестирующий инструмент, это тестирующий подход.

Примечание: если вы не реагируете, есть Vuue-Testing-библиотека , NG-тестирование-библиотека и другие , все построен на вершине Дом-тестирование-библиотека Отказ

Лучшая особенность реактивно-тестирования-библиотеки, вероятно, его поддержка UI TDD. Согласно документам, это Первичный руководящий принцип является:

Это «подход», о котором я говорю. Проверьте свой UIS так же, как ваш друг без техники будет. Ваш пользователь, вероятно, не знает, ни не волнует, как выглядит ваш код. И и не должен ваш тест. Это дает нам возможность использовать TDD на нашем UIS.

Вот как мы собираемся написать наш тест Socket.io-Client – проверьте все, не думая о коде. Теперь давайте сделаем это!

Тестирование приложения Telegram

Из нашей очень талантливой телеграммы UI Designer, Bellow – это конструкции приложения Telegram, мы будем тестировать.

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

  • Приложение должно получить сообщения
  • Приложение должно сказать, когда/если сообщение отправлено или нет
  • Приложение должно сказать, когда/если сообщение доставляется или нет
  • Приложение должно сказать, когда друг наступает в Интернет/отключается в автономном режиме
  • Приложение должно сказать, когда друг печатает

Хорошо, список продолжается … но давайте сначала поработаем сначала.

Получение сообщений

Давайте посмотрим на то, как пользователь будет знать, если они получили сообщение в качестве примера. Во-первых, создайте тестовый файл, затем импортируйте файл Chat.js и его издеванные зависимости. Если вы новичок, чтобы издеваться или такими вещами, то Кент C. Доддс действительно должен быть вашим другом. У него все покрыто для тестирования JavaScript, поэтому просто следуйте за ним здесь, Twitter и везде еще.

Теперь, как я писал эту линию, я думал, что он должен просто написать книгу о тестировании JS, поэтому я Tweeted:

И, надеюсь, он в конечном итоге:)

Вернуться к нашему тесту:

// chat.test.jsimport React from 'react';import io from 'socket.io-client';
import Chat from './chat';

Потому что мы делаем только тестирование интеграции здесь, мы действительно не хотим излучать Socket.io события на сервер. Поэтому нам нужно изменить Socket.io-клиент. Для получения дополнительной информации о насмесении см. Статью Кента » Но на самом деле, что такое JavaScript Mock? «А также этот раздел от Jest Docs On Jest Mock Functions Отказ

После того, как вы понимаете, как насмешлиц, следующее – это понимание того, что делает ваш модуль, а затем подделать реализацию.

// socket.io-client.js
let EVENTS = {};
function emit(event, ...args) { EVENTS[event].forEach(func => func(...args));}
const socket = { on(event, func) {  if (EVENTS[event]) {   return EVENTS[event].push(func);  }  EVENTS[event] = [func]; }, emit};
export const io = { connect() {  return socket; }};
// Additional helpers, not included in the real socket.io-client,just for out test.
// to emulate server emit.export const serverSocket = { emit }; // cleanup helperexport function cleanup() { EVENTS = {}}
export default io;

С этим у нас есть достаточно хорошего сокета. Давайте использовать это.

// chat.test.jsimport React from 'react';import mockio, {serverSocket, cleanUp } from 'socket.io-client';
import Chat from './chat';

Теперь давайте напишем наш первый тест. Традиционный подход TDD говорит, что мы напишем тест на функцию, посмотрите, что он не сможет выполнить функцию, чтобы удовлетворить наш тест. Для краткости мы не собираемся делать точно Это, как эта статья фокусируется на тестировании.

После подхода к библиотеке реагирования-тестирования первое, что вы делаете, прежде чем писать любой тест, это спросить себя: «Как пользователь проверит эту функцию? ” Для первого теста в нашем списке выше вы спрашиваете себя: «Как пользователь узнает, что они получают сообщения, которые отправляют их друг?». Чтобы проверить его, они, вероятно, скажут лицу рядом с ними, чтобы отправить им сообщение.

Обычно, как это будет работать, состоит в том, что друга пользователя отправляет сообщение на сервер с адресом пользователя, затем сервер испускает сообщение для пользователя. Теперь, поскольку мы не тестируем, если пользователь может отправить сообщение в это время, но может ли пользователь получить Сообщение, давайте иметь Socket.io Сервер напрямую отправьте пользователю сообщение.

// chat.test.jsimport React from 'react';import mock-io, {serverSocket, cleanUp } from 'socket.io-client';import {render} from 'react-testing-library';
import Chat from './chat';
test('App should get messages', () => {  // first render the app  const utils = render()    // then send a message  serverSocket.emit('message', 'Hey Wizy!');})

Выше мы импортировали оказывать Способ из библиотеки реагирования-тестирования, которая просто обертка вокруг Reactom.runder Отказ В нашем тексте мы используем его, чтобы сделать наше приложение в чате. Способ Render Возвращает тестовый объект утилиты, который содержит методы запроса, мы можем использовать для запроса Контейнер нашего приложения – узел DOM оказывать Оказано наше приложение в – для узлов DOM наш тест заинтересован. Далее в тексте используйте наш Mock Socket.io Server для отправки сообщения пользователю.

Теперь, когда мы отправили сообщение для пользователя, подумайте еще раз: как пользователь узнает, что они получили сообщение? Из дизайна выше, они определенно должны посмотреть на экран, чтобы увидеть сообщение появления. Итак, чтобы проверить это, мы должны запрашивать контейнер нашего приложения, чтобы увидеть, есть ли у него узел, который содержит сообщение, которое мы отправили, «Эй, Wizy!» Для этого утилита объект возвращен из оказывать имеет метод запроса под названием getbytext , чтобы мы могли просто сделать:

Ожидайте (utils.getbytext («Эй, Wizy!»)). Tobetrouthyy ();

Хотя это может работать, к сожалению, мы не можем этого сделать. Вот почему: все методы запроса возвращены из оказывать Поищите весь контейнер для указанного запроса. Это означает, что getbytext Используется выше, ищете весь контейнер для текста Эй, Wizy! ‘, Затем возвращает первый узел, который имеет этот текст.

Но это не так, как наш пользователь будет искать текст. Вместо этого наш пользователь будет выглядеть только в пределах «Сообщения – раздел», раздел, содержащий все сообщения. Только если сообщения появляются в этом разделе, они узнают, что у них есть сообщение. Итак, наш тест напоминает, как пользователь использует наше приложение, нам нужно будет искать текст » Эй, виш! только внутри Сообщения – раздел, как и пользователь.

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

Примечание: в пределах Это новый API, который был вдохновлен этой статьей, поэтому убедитесь, что у вас есть самая последняя версия библиотеки реагирования-тестирования.

// chat.test.jsimport React from 'react';import mock-io, {serverSocket, cleanUp } from 'socket.io-client';import {render, within} from 'react-testing-library';
import Chat from './chat';
test('App should get messages', () => {  // first render the app  const utils = render()    // then send a message  serverSocket.emit('message', 'Hey Wizy!');    // the message must appear in the message-section  const messageSection = utils.getByTestId('message-section');  // check withing messageSection to find the received message  const message = within(messageSection).getByText('Hey Wizy!');})

Во-первых, мы схватили раздел сообщений с методом запроса getbytestid . Использовать getbytestid В вашем тесте у вас есть жесткий код в доме. Вот так:

/>

Потому что getbytestid Не похоживает, как пользователи находят разделы вашего приложения, вы должны использовать его только на Spacial Case, и только когда вы уверены, что нет лучшего альтернативы.

Тем не менее, наш тест не полагается на структуру DOM. Даже если кто-то меняет Div к Раздел Тейте или обертывающие его 10 уровней глубоко в DOM, наш тест не просто заботятся о коде – он просто заботится о тестовом идентификаторе.

Наконец, мы используем в пределах Метод, как описано ранее, чтобы получить полученное сообщение. Если текст не найден, getbytext бросит и провалил наш тест.

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

Написание больше тестов

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

Так что теперь, давайте напишем второй тест: приложение должно сообщить пользователю, когда/если сообщение было отправлено или нет. Кроме того, я думаю, что этот тест в основном делает то же самое, что и следующий в списке, поэтому давайте объединим оба в один пример.

Опять же, первый вопрос, который мы спрашиваем, это …? Я знаю, что получил это: «Как наш пользователь проверит эту функцию?» Хорошо, как вы делаете свой вопрос, могут быть разными, но вы поняли идею:). Итак, чтобы проверить функцию отправки сообщения, шаги будут выглядеть так:

  • Пользователь находит вход, чтобы ввести их сообщение. Затем они входят в свое сообщение. Наконец, они нажимают кнопку отправки.
  • Сообщение должно появиться в разделе сообщения
  • Сервер скажет, если сообщение попасть на сервер, что означает послал
  • Пользователь должен пометить сообщение как отправлено
  • Сервер затем говорит, когда сообщение поставляется
  • Пользовательский интерфейс должен, в свою очередь, обновит сообщение как доставлено

Как пользователь находит вход, чтобы войти в их сообщение? От дизайна пользовательского интерфейса мы работаем, они должны посмотреть и найти вход с сообщением пользователя. (Ну, это на самом деле, это единственный вход на экран, но даже если есть еще, пользователь будет идентифицировать вход, чтобы ввести их сообщение на заполнитель или метку.)

Библиотека React-Testing-Bibly снова покрыта методом запроса под названием GetBeacholdHoldertex.

// chat.test.jsimport React from 'react';import mock-io, {serverSocket, cleanUp } from 'socket.io-client';import {render, renderIntoDocument, within, cleanup} from 'react-testing-library';
import Chat from './chat';
afterEach(cleanup);
test('App should get messages', () => {  // ...})
test('App should tell when message is sent and delivered', () => {  // first render the app  const utils= renderIntoDocument()    // enter and send a message  utils.getByPlaceholderText('message').value = 'Hello';  utils.getByTestId('send-btn').click()})

Поэтому мы представили пару новых API здесь. Первый – это RenderIntodocument метод. Мы должны стрелять на настоящие домо-события, а не имитировать их, в нашем тесте, так как это более близко напоминает, как пользователи используют наше приложение.

Недостаток в том, что оказывать Метод создает и делает наше приложение к произвольному узлу DOM, называемой Контейнер , на лету. Но реагируйте обрабатывает события через делегирование событий – прикрепление одного события для всех типов событий на Документ И затем делегирование события на соответствующий узел DOM, который вызвал событие.

Итак, чтобы пожарить события Real DOM, нам нужно на самом деле сделать наше приложение в Документ. Тебе Отказ Вот что RenderIntodocument. делает для нас.

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

В тесте после введе мы введем значение, мы нажимаем кнопку отправки, чтобы отправить наше сообщение. Если вы заметили, глядя на дизайн, нет кнопки отправки. Но если вы вытащите свою телеграмму или WhatsApp прямо сейчас, вы заметите, что кнопка отправки появляется только при фактическом введении текста в входе сообщения. Наш тест просто случайно охватил эту функцию.:)

Теперь, когда мы нажали кнопку отправки, давайте сделаем некоторые утверждения.

// chat.test.jsimport React from 'react';import mock-io, {serverSocket, cleanUp } from 'socket.io-client';import {render, renderIntoDocument, within, cleanup} from 'react-testing-library';
import Chat from './chat';
afterEach(cleanup);
test('App should get messages', () => {  // ...})
test('App should tell when message is sent/delivered', () => {  // first render the app  const utils = renderIntoDocument()    // enter and send a message  utils.getByPlaceholderText('message').value = 'Hello';  utils.getByTestId('send-btn').click();    // the message should appear on the message section  const messageSection = uitils.getByTestId('message-section');  expect(within(messageSection).getByText('Hello')).toBeTruthy();    // server tells us message is sent  serverSocket.emit('message-sent');
  // Now the UI should mark the message as sent  const message = within(messageSection).getByText('Hello');  expect(within(message).getByTestId('sentIcon')).toBeTruthy();
  // server tells us it's delivered  serverSocket.emit('message-delivered');
  // UI should mark the message as delivered  expect(within(message).getByTestId('deliveredIcon')).toBeTruthy();})

Вот и все. Точно так же, как ожидаемое пользователь, наше тест ожидает, чтобы значок отправленного/поставляемого появится рядом с сообщением, когда он отправляется/доставлен.

До сих пор мы видели, насколько легко тестирование в реальном времени приложение Socket.io-клиент может быть с библиотекой React-Testing. Неважно, что вы тестируете, когда вы следите за этим подходом, вы получаете больше уверенности, что ваше приложение работает так, как следует. И что еще больше, у нас все еще есть нулевая идея Как будет выглядеть реализация приложения. Как пользователь, Наш тест просто не заботится о реализации!

Заканчивать

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

  • Приложение должно сказать, когда друг наступает в Интернет/отключается в автономном режиме
  • Приложение должно сказать, когда друг печатает

Кончик: У вас должен быть сервер Socket.IO излучает событие, то вы утверждаете, как будет выглядеть пользовательский интерфейс. Подумайте о том, как точно Пользователь узнает, когда друг набрал, онлайн, в автономном режиме.

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

Если у вас есть вопрос, который не ответил и не чувствую по-разному о некоторых очках здесь, не стесняйтесь бросать некоторые комментарии здесь или через Twitter Отказ

Вы также можете захотеть следовать за мной здесь и/или в Twitter для более потрясающих статей. И вы можете проверить мои предыдущие статьи:

Оригинал: “https://www.freecodecamp.org/news/testing-socket-io-client-app-using-jest-and-react-testing-library-9cae93c070a3/”