includes, startsWith, endsWith
Следующие три
метода позволяют проверять: есть ли в строке искомая подстрока. Первый метод
имеет ожидаемый синтаксис:
str.includes(substr)
он возвращает true, если подстрока
substr была найдена в
строке str и false в противном
случае. Второй необязательный параметр pos указывает
начальный индекс для поиска. Вот примеры использования данного метода:
let str = '<span class="clock">12:34</span>'; console.log( str.includes("span") ); console.log( str.includes("<span>") ); console.log( str.includes("clock", 20) );
Следующие два
метода startsWith и endsWith проверяют, соответственно, начинается ли и
заканчивается ли строка определённой строкой:
console.log( str.startsWith("span") ); //false console.log( str.startsWith("<span") ); //true console.log( str.endsWith("span>") ); //true
Перво-наперво: откуда мне знать, что тестировать?
Когда дело доходит до тестирования, даже простой блок кода может парализовать новичков. Самый распространенный вопрос — «Как мне узнать, что надо тестировать?». Если вы пишете веб-приложение, хорошей отправной точкой будет тестирование каждой страницы приложения и каждого взаимодействия с пользователем. Но веб-приложения также состоят из блоков кода, таких как функции и модули, которые также должны быть протестированы. В большинстве случаев есть два сценария:
- вы наследуете устаревший код, который поставляется без тестов
- Вы должны реализовать новую функциональность с нуля.
Что делать? В обоих случаях вы можете помочь себе, рассматривая тесты как куски кода, которые проверяют, дает ли данная функция ожидаемый результат. Вот как выглядит типичный процесс тестирования:
- импортируем функцию для тестирования
- предоставляем входные параметры функции
- определяем что ожидается на выходе
- проверить соответствует ли это то что возвращает функция
На самом деле, это все. Тестирование больше не будет страшным, если вы будете думать так: входные параметры — ожидаемый результат — оценка результата. Через минуту мы также увидим удобный инструмент для почти точной проверки того, что тестировать. А теперь руки на Jest!
Выбор выполняемых тестов¶
поддерживает несколько способов выбора и запуска тестов из командной строки.
Запуск тестов модуля
pytest test_mod.py
Запуск тестов из директории
pytest testing/
Запуск тестов, удовлетворяющих ключевому выражению
pytest -k "MyClass and not method"
Эта команда запустит тесты, имена которых удовлетворяют заданному строковому выражению
(без учета регистра). Строковые выражения могут включать операторы , которые
используют имена файлов, классов и функций в качестве переменных. В приведенном выше
примере будет запущен тест , но не будет запущен тест
.
Запуск тестов по идентификаторам узлов
Каждому собранному тесту присваивается уникальный идентификатор ,
который состоит из имени файла модуля, за которым следуют спецификаторы,
такие как имена классов, имена функций и параметры из параметризации, разделенные символами :
Чтобы запустить конкретный тест из модуля, выполните:
pytest test_mod.py::test_func
Еще один пример спецификации тестового метода в командной строке:
pytest test_mod.py::TestClass::test_method
Запуск маркированных тестов
pytest -m slow
Будут запущены тесты, помеченные декоратором .
Подробнее см. .
Запуск тестов из пакетов
pytest --pyargs pkg.testing
IIFE с параметрами
IIFE не только могут отдавать значения, но ещё и брать аргументы во время своего вызова. Давайте посмотрим на этот короткий пример.
В примере выше, а именно на 1й строке, IIFE чисто формально имеет два параметра с именами и .
Когда мы выполняем её на 5й строке, то вместо пустых скобок, мы в них передаём аргументы IIFE.
Строки 2 и 3 используют эти параметры уже внутри IIFE.
Это тоже довольно полезный паттерн и мы часто его видим в jQuery, да и в других библиотеках тоже.
В пример выше, мы передаём , и , как аргументы к IIFE на строке 3. Код внутри IIFE может ссылаться к ним, как к , , .
Вот несколько преимуществ такой передачи параметров к IIFE.
JavaScript всегда делает поиск по области видимости заданной функции и продолжает поиск в области видимости выше, пока не найдёт указанный идентификатор. Когда мы передаём на 3 строке, то это один и единственный раз, когда мы делаем поиск вне локальной области видимости. Любые отсылки к в IIFE, никогда не должны искаться за пределами локальной области видимости самой IIFE. Так же и с . Даже в зависимости от сложности кода, рост производительности может быть не слишком высок, но всё равно эту фишку полезно знать.
Также, минифаеры JS могут безопасно минифицировать имена параметров, указанных в функции. Если мы не передавали эти параметры, то минифаеры не будут отсылаться к или , так как они находятся вне области видимости этой функции.
Как вставить строку в середину другой строки?
Это самый интересный вариант добавления одной строки в другую строку. Он возможен только при помощи обратных кавычек , которые дают строке возможность интеграции в неё переменных JavaScript. Переменные помещаются внутрь фигурных скобок, специальной экранирующей конструкции ${}
var str1 = 'новая тема' var str2 = `Сегодня ${str1} по JavaScript.`
Давайте посмотрим на результат работы вычисления значения второй строки:
Вставили строку в середину другой строки — вычислили значение — JavaScript
В переменной str2 сейчас находится строковое значение «»
Мы один раз вычислили значение переменной str2, когда объявили её. Если мы сейчас изменим значение переменной str1 и просто обратимся ко второй, то вторая строка будет с тем же содержимым, что была в первом объявлении.
Обратились — не вызвали — JavaScript
Издевательство
При тестированиинасмешливыйпозволяет тестировать функциональность, зависящую от:
- База данных
- СетьЗапросы
- доступ кФайлы
- любойВнешнийсистема
так что:
- ваши тесты запускаютсяБыстрее, что позволяет быстро обойтись во время разработки
- ваши тестынезависимыйсостояния сети или состояния базы данных
- ваши тесты незагрязнятьлюбое хранилище данных, потому что они не касаются базы данных
- любое изменение, сделанное в тесте, не изменяет состояние для последующих тестов, и повторный запуск набора тестов должен начинаться с известной и воспроизводимой начальной точки.
- вам не нужно беспокоиться об ограничении скорости вызовов API и сетевых запросов
Мокинг полезен, когда вы хотите избежать побочных эффектов (например, записи в базу данных) или вы хотите пропустить медленные части кода (например, доступ к сети), а также избежать последствий при многократном запуске ваших тестов (например, представьте себе функцию, которая отправляет электронное письмо или вызов API с ограничением скорости).
Еще важнее, если вы пишетеМодульный тест, вам следует тестировать функциональность функции изолированно, а не со всем набором вещей, которых она касается.
Используя макеты, вы можете проверить, была ли вызвана функция модуля и какие параметры использовались, с помощью:
- : проверьте, была ли вызвана шпионская функция
- : подсчитать, сколько раз вызывалась шпионская функция
- : проверить, вызывалась ли функция с определенным набором параметров
- : проверить параметры последнего вызова функции
Шпионские пакеты, не влияющие на код функций
Когда вы импортируете пакет, вы можете указать Jest «шпионить» за выполнением определенной функции, используя, не влияя на то, как этот метод работает.
Пример:
Имитация всего пакета
Jest предоставляет удобный способ имитировать весь пакет. Создатьв корне проекта, и в этой папке создайте по одному файлу JavaScript для каждого из ваших пакетов.
Скажите, что вы импортируете. Создатьфайл в корне вашего проекта и добавьте это содержимое:
Это будет имитировать функцию пакета log (). Добавьте столько функций, сколько хотите имитировать:
Имитация единственной функции
Вы можете издеваться над одной функцией, используя:
Вы также можете использоватьчтобы создать простой макет, который ничего не делает, кроме возврата значения.
Готовые макеты
Вы можете найти готовые макеты для популярных библиотек. Например этот пакетhttps://github.com/jefflau/jest-fetch-mockпозволяет высмеиватьвызовы и предоставить образцы возвращаемых значений без взаимодействия с реальным сервером в ваших тестах.
Пример в действии
Для запуска тестов нужны соответствующие JavaScript-библиотеки.
Мы будем использовать:
- Mocha – эта библиотека содержит общие функции для тестирования, включая и .
- Chai – библиотека поддерживает разнообразные функции для проверок. Есть разные «стили» проверки результатов, с которыми мы познакомимся позже, на текущий момент мы будем использовать лишь .
- Sinon – для эмуляции и хитрой подмены функций «заглушками», понадобится позднее.
Эти библиотеки позволяют тестировать JS не только в браузере, но и на сервере Node.JS. Здесь мы рассмотрим браузерный вариант, серверный использует те же функции.
Пример HTML-страницы для тестов:
Эту страницу можно условно разделить на четыре части:
Блок – в нём мы подключаем библиотеки и стили для тестирования, нашего кода там нет.
Блок с реализацией спецификации, в нашем случае – с кодом для .
Далее подключаются тесты, файл содержит , который был описан выше
Методы и принадлежат библиотеке Mocha, так что важно, что она была подключена выше.
Элемент будет использоваться библиотекой Mocha для вывода результатов. Запуск тестов инициируется командой .
Результат срабатывания:
Пока что тесты не проходят, но это логично – вместо функции стоит «заглушка», пустой код.
Пока что у нас одна функция и одна спецификация, но на будущее заметим, что если различных функций и тестов много – это не проблема, можно их все подключить на одной странице. Конфликта не будет, так как каждой части кода соответствует свой блок . Сами же тесты обычно пишутся так, чтобы не влиять друг на друга, не делать лишних глобальных переменных.
Сравнение строк
Равенство
Как вы знаете, что сравнивая два строковых примитива, вы можете использовать операторы == или ===:
"abba" === "abba" // true "abba" == "abba" // true
Если вы сравниваете строковый примитив с чем-то, что не является строкой, == и === ведут себя по-разному.
При использовании оператора == не-строка будет преобразована в строку. Это означает, что JavaScript попытается преобразовать его в строку перед сравнением значений.
9 == "9" // становится "9" == "9" //true
Для строгого сравнения, когда не-строки не приводятся к строкам, используйте ===:
9 === "9" // false
То же самое верно и для операторов неравенства != и !==:
9 != "9" // false 9 !== "9" // true
Если вы не знаете, что использовать, отдавайте предпочтение строгому равенству ===.
При использовании объектов String два объекта с одинаковым значением не считаются равными строками в JavaScript:
new String("js") == new String("js") // false new String("js") === new String("js") // false
Чувствительность к регистру
Когда требуется сравнение без учета регистра, обычно преобразуют обе строки в верхний или нижний регистры и сравнивают результат.
"Hello".toUpperCase() === "HeLLo".toUpperCase() // true
Однако иногда вам нужно больше контроля над сравнением. Об этом в следующем разделе …
Работа с диакритическими знаками в строках JavaScript
Диакритические знаки — это модификации буквы, например é или ž.
Возможно вы захотите указать, как они обрабатываются при сравнении двух строк.
Например, в некоторых языках принято исключать акценты при написании прописных букв.
Если вам нужно сравнение без учета регистра, простое преобразование двух строк в один и тот же регистр с помощью или не будет учитывать добавление / удаление акцентов и может не дать ожидаемого результата.
Если вам нужен более точный контроль над сравнением, используйте вместо него localeCompare:
let a = 'Résumé'; let b = 'RESUME'; // Возвращает 'false' - строки не совпадают a.toLowerCase() === b.toLowerCase() // Возвращает '0' - строки совпадают a.localeCompare(b, undefined, { sensitivity: 'base' })
Метод позволяет указать «sensitivity» сравнения.
Здесь мы использовали base «sensitivity» для сравнения строк с использованием их «базовых» символов (что означает, что регистр и акценты игнорируются).
Поддержка браузерами:
- Chrome: 24+
- Edge: 12+
- Firefox: 29+
- Safari: 10+
- Opera: 15+
Больше / меньше
При сравнении строк с использованием операторов < и > JavaScript будет сравнивать каждый символ в «лексикографическом порядке».
Это означает, что они сравниваются по буквам в том порядке, в котором они появляются в словаре:
"aardvark" < "animal" // true "gamma" > "zulu" // false
При сравнении строк с использованием < или > строчные буквы считаются большими, чем прописные.
"aardvark" > "Animal" // true
Это происходит потому, что JavaScript использует значение каждого символа в Unicode, где строчные буквы идут после прописных.
True или false строки
Пустые строки в JavaScript считаются равными false при сравнении с использованием оператора == (но не при использовании ===).
("" == false) // true ("" === false) // false
Строки со значением являются «истинными», поэтому вы можете делать нечто подобное:
if (someString) { // у строки есть значение } else { // пустая строка или undefined }
Добавление символов новой строки в строку
Операционные системы имеют специальные символы, обозначающие начало новой строки. Например, в Linux новая строка обозначается “ \n” , также называется каналом строк . В Windows новая строка обозначается с помощью “ \r\n” , иногда называемой Возвратом каретки и подачей строки или CRLF .
Добавление новой строки в Java так же просто, как включение ” \n” , ” \r”, или ” \ r \n” в конце нашей цепочки.
2.1. Использование разрывов строк CRLF
В этом примере мы хотим создать абзац, используя две строки текста. В частности, мы хотим, чтобы line2 появился в новой строке после line1 .
Для Unix/Linux/новой ОС на базе Mac мы можем использовать ” \n”:
String line1 = "Humpty Dumpty sat on a wall."; String line2 = "Humpty Dumpty had a great fall."; String rhyme = line1 + "\n" + line2;
Если мы находимся в ОС на базе Windows, мы можем использовать ” \r\n”:
rhyme = line1 + "\r\n" + line2;
Для старой ОС на базе Mac мы можем использовать ” \r”:
rhyme = line1 + "\r" + line2;
Мы продемонстрировали три метода добавления новой строки, но, к сожалению, они зависят от платформы.
2.2. Использование Независимых От Платформы Линейных Разделителей
Мы можем использовать системные константы, когда хотим, чтобы наш код был независимым от платформы.
Например, с помощью Система.Линейный разделитель() для предоставления разделителя строк:
rhyme = line1 + System.lineSeparator() + line2;
Или мы могли бы также использовать System.getProperty(“строка.разделитель”) :
rhyme = line1 + System.getProperty("line.separator") + line2;
2.3. Использование Независимых От Платформы Символов Новой Строки
Хотя разделители строк обеспечивают независимость от платформы, они заставляют нас объединять ваши строки.
Если мы используем что-то вроде System.out.printf или String.format , то независимый от платформы символ новой строки %n может использоваться непосредственно в строке
rhyme = "Humpty Dumpty sat on a wall.%nHumpty Dumpty had a great fall.";
Это то же самое, что включить System.LineSeparator() в нашу строку, но нам не нужно разделять строку на несколько частей.
slice
Есть три
основных метода для выделения подстрок из строки – это substring, substr и
slice. Метод slice имеет следующий
синтаксис:
str.slice(start )
и возвращает
часть строки от start до end (не включая его).
Например:
console.log( str.slice(, 5) ); //<span console.log( str.slice(6, 11) ); //class console.log( str.slice(12) ); //"clock"... console.log( str.slice(-7, -1) ); //</span
Следующий метод
str.substring(start )
работает
практически также как и slice, но здесь аргумент start может быть
больше, чем end, например:
console.log( str.substring(6, 11) ); //class console.log( str.substring(11, 6) ); //class
Но отрицательные
значения записывать нельзя, они будут трактоваться как 0.
Последний метод
str.substr(start )
Возвращает часть
строки, начиная с индекса start и длиной в length символов. В противоположность
предыдущим методам, здесь указывается длина вместо конечной позиции:
console.log( str.substr(6, 13) ); //class = "clock" console.log( str.substr(12) ); //"clock">12:34</span>
При
отрицательном значении первого аргумента позиция отсчитывается с конца строки.
Какой из этих
трех методов выбирать для выделения строк? По большому счету без разницы. Они
все работают эффективно, так что это дело предпочтения программиста.
Jest Tutorial: спецификации и разработка на основе тестирования
Как разработчики, мы все любим свободу творчества. Но когда дело доходит до серьезных вещей, большую часть времени у вас не так много привилегий. Чаще всего мы должны следовать спецификациям, то есть письменному или устному описанию того, что строить.
В этом уроке представим что мы получили довольно простую спецификацию от нашего менеджера проекта
Очень важному клиенту нужна функция JavaScript, которая должна фильтровать массив объектов
Для каждого объекта мы должны проверить свойство с именем «url», и если значение свойства соответствует предоставленному поисковому термину, мы должны включить соответствующий объект в результирующий массив. Будучи опытным разработчиком JavaScript-кода, вы хотите следовать test-driven development, дисциплине, которая требует написания теста с ошибкой перед началом написания кода.
По умолчанию Jest ожидает найти тестовые файлы в папке с именем __tests__ в папке вашего проекта. Создайте новую папку, затем:
cd getting-started-with-jest mkdir __tests__
Затем создайте новый файл с именем filterByTerm.spec.js внутри __tests__. Вы можете спросить, почему расширение включает «.spec.». Это соглашение, заимствованное из Ruby для пометки файла как specification для данной функциональности.
А теперь давайте пройдем тестирование!
Определение строки
Строкой считается любая последовательность символов в пределах двойных или одинарных кавычек.
var someString = «This is a string»;
var anotherString = ‘This is another string’;
1 |
varsomeString=»This is a string»; varanotherString=’This is another string’; |
Для создания строки с кавычками, нужно их экранировать (обособить) с помощью символа обратный слэш или использовать два разных вида кавычек.
var string = «String with \»quoted\» word»;
var string = ‘String with \’quoted\’ word’;
var string = ‘String with «quoted» word’;
var string = «String with ‘quoted’ word»;
var string = «It’s single quote string»; //Апостроф внутри строки
var string = ‘<div id=»block»>This is block</div>’; //В строке может содержаться код HTML
1 |
varstring=»String with \»quoted\» word»; varstring=’String with \’quoted\’ word’; varstring=’String with «quoted» word’; varstring=»String with ‘quoted’ word»; varstring=»It’s single quote string»;//Апостроф внутри строки varstring='<div id=»block»>This is block</div>’;//В строке может содержаться код HTML |
Помимо двойных и одинарных кавычек, экранизации подлежат и другие символы (escape последовательности), управляющие форматированием текста.
Символ | Обозначение |
---|---|
\’ | одинарная кавычка |
\» | двойная кавычка |
\\ | обратный слэш (не путать с // — знаком начала комментария) |
\n | новая строка (работает как кнопка Enter) |
\r | возврат каретки в начало строки (работает как кнопка Home) |
\t | табуляция (работает как кнопка Tab) |
\b | удаление символа (работает как кнопка Backspace) |
\f | печать с новой страницы (устаревшее) |
\v | вертикальная табуляция (устаревшее) |
\a | звуковой сигнал (устаревшее) |
\xXX | символ из Latin-1, где XX шестнадцатеричные цифры (например: \xAF — символ ‘-‘) |
\XXX | символ из Latin-1, где XXX восьмеричные цифры от 1 до 377 (например: \300 — символ ‘À’) |
\ucXXXX | символ из Unicode, где XXXX шестнадцатеричные цифры (например: \uc454 — символ ‘쑔’) |
В случае если строка достаточно длинная, то для более легкого чтения ее можно разбить на подстроки с помощью символа обратного слэша , не нарушая при этом самой структуры строки.
var longString = «Lorem ipsum dolor sit amet, consectetur adipisicing elit.\
Aliquam eligendi non ipsum autem facere repellendus doloremque, \
architecto obcaecati culpa dolores eveniet qui, beatae suscipit ab nisi ad vero, sed cum!»;
1 |
varlongString=»Lorem ipsum dolor sit amet, consectetur adipisicing elit.\ Aliquam eligendi non ipsum autem facere repellendus doloremque, \ architecto obcaecati culpa dolores eveniet qui, beatae suscipit ab nisi ad vero, sed cum!»; |
Однако использование следующего приема для разбиения кода недопустимо.
var string = «Lorem ipsum dolor sit amet,» + \
«consectetur adipisicing elit.»;
1 |
varstring=»Lorem ipsum dolor sit amet,»+\ «consectetur adipisicing elit.»; |
Классический модульный паттерн в JavaScript
Теперь, когда вы отточили навыки работы с IIFE, давайте посмотрим на пример модульного паттерна, который раскрывают всю мощь совместного применения замыканий и IIFE функций.
Тут мы применим классический синглтон объект , в котором всё стабильно отрабатывает без возможности непреднамеренного изменения значения.
Мы разделим код на два шага, чтобы постепенно понять то, что происходит под капотом.
В этом примере, наша IIFE отдаёт объект. Смотрите строки 7 и 8.
Также тут есть локальная переменная под названием .
Отдаваемое IIFE значение, которое является объектом и назначается на переменную .
А теперь давайте усложним код, добавив несколько функций в отдаваемый нами объект.
В этом примере мы добавили две функции нашему отдаваемому объекту.
Строки 8–10 хранят функцию , которая отдаёт значение из переменной .
Строки 12–15 добавляют функцию , которая увеличивает значение на 1 и затем отдаёт его значение.
Так как переменная является приватной в IIFE, то никто кроме функций, имеющих доступ к IIFE через замыкание, не имеет к ней доступа.
Теперь вы узнали реально мощный паттерн JavaScript. Он включает в себя мощь использования IIFE и замыканий вместе.
Это очень простая вариация модульного паттерна. Есть и другие паттерны такого плана, но почти все из них используют IIFE для создания закрытой области видимости.
Управляющие последовательности
В строковых литералах можно использовать управляющие последовательности. Управляющая последовательность – это последовательность, состоящая из обычных символов, которая обозначает символ, не представимый внутри строки другими способами. Управляющие последовательности предназначены для форматирования вывода текстового содержимого.
В таблице ниже представлены управляющие последовательности:
Последовательность | Значение |
---|---|
Символ NUL – пустой символ (). | |
Горизонтальная табуляция (). | |
Перевод на новую строку (). | |
Возврат на одну позицию – то, что происходит при нажатии на клавишу backspace (). | |
Возврат каретки (). | |
Перевод страницы – очистка страницы (). | |
Вертикальная табуляция (). | |
Двойная кавычка (). | |
Одинарная кавычка (). | |
Обратный слэш (). | |
Номер символа из набора символов ISO Latin-1, заданный двумя шестнадцатеричными цифрами ( – шестнадцатеричная цифра ). Например, (это код буквы ). | |
Номер символа из набора символов Unicode, заданный четырьмя шестнадцатеричными цифрами ( – шестнадцатеричная цифра ). Например, (это код буквы ). |
Управляющие последовательности могут находиться в любом месте строки:
alert("Греческая буква сигма: \u03a3."); // Греческая буква сигма: Σ. alert("Многострочная\nстрока") // Многострочная // строка alert("внутри используются \"двойные\" кавычки"); // внутри используются "двойные" кавычки
Если символ предшествует любому символу, отличному от приведённых в таблице, то он просто игнорируется интерпретатором:
alert("\k"); // "k"
Символы Unicode, указываемые с помощью управляющей последовательности, можно использовать не только внутри строковых литералов, но и в идентификаторах:
let a\u03a3 = 5; alert(a\u03a3); // 5
Свойства строк
Свойство | Описание | |
---|---|---|
constructor | возвращает функцию-конструктор строки | |
var str = «Hello world!»;
|
||
length | возвращает длину (количество символов) строки | |
var str = «Hello world!»;
|
||
prototype | позволяет добавить свойства и методы к объекту (если строка — объект) | |
function student(name, surname, faculty) {
|
Доступ к свойствам
ECMAScript 5 (2009) разрешает доступ к свойствам для строк:
Пример
var str = «ПРИВЕТ МИР»;
str; // возвращается П
Доступ к свойствам может быть немного непредсказуемым:
- Не работает в Internet Explorer 7 или более ранней версии.
- Это делает строки похожими на массивы (но это не так)
- Если символ не найден, [] возвращает значение undefined, а charAt () возвращает пустую строку.
- Он доступен только для чтения. str = «A» не выдает ошибки (но не работает!)
Пример
var str = «ПРИВЕТ МИР»;
str = «A»;
// Не дает никакой ошибки, но и не работает
str; // возвращается П
Если вы хотите работать со строкой как с массивом, вы можете преобразовать ее в массив.
Спецсимволы в строках JS
Многострочные строки также можно создавать с помощью одинарных и двойных кавычек, используя так называемый «символ перевода строки», который записывается как \n:
JavaScript
// Вывод строки, состоящей из нескольких строк, с использованием спецсимвола /n
let guestList_1 = «Guests:\n * John\n * Pete\n * Mary»;
console.log(guestList_1); // список гостей, состоящий из нескольких строк
1 |
// Вывод строки, состоящей из нескольких строк, с использованием спецсимвола /n let guestList_1=»Guests:\n * John\n * Pete\n * Mary»; console.log(guestList_1);// список гостей, состоящий из нескольких строк |
Таблица спецсимволов
Символ | Описание |
\n | Перевод строки |
\r | Возврат каретки: самостоятельно не используется. В текстовых файлах Windows для перевода строки используется комбинация символов \r\n. |
\’ , \» | Кавычки (экранированные) |
\\ | Обратный слеш |
\t | Знак табуляции |
\b, \f, \v | Backspace, Form Feed и Vertical Tab — оставлены для обратной совместимости, сейчас не используются. |
\xXX | Символ с шестнадцатеричным юникодным кодом XX, например, ‘\x7A’ — то же самое, что ‘z’. |
\uXXXX | Символ в кодировке UTF-16 с шестнадцатеричным кодом XXXX, например, \u00A9 — юникодное представление знака копирайта, . Код должен состоять ровно из 4 шестнадцатеричных цифр. |
\u{X…XXXXXX} (от 1 до 6 шестнадцатеричных цифр) | Символ в кодировке UTF-32 с шестнадцатеричным кодом от U+0000 до U+10FFFF. Некоторые редкие символы кодируются двумя 16-битными словами и занимают 4 байта. Так можно вставлять символы с длинным кодом. |
Особенности экранирования кавычек обратным слэшем (\):
требование экранировать относится только к таким же кавычкам, как те, в которые заключена строка.
JavaScript
// Перед входящей в строку кавычкой необходимо добавить обратный слеш — \’, иначе она бы обозначала окончание строки.
alert( ‘I\’m Alex!’ ); // I’m Alex!
// Более элегантное решение — использование обратных кавычек:
alert( `I’m Alex!` ); // I’m Alex!
1 |
// Перед входящей в строку кавычкой необходимо добавить обратный слеш — \’, иначе она бы обозначала окончание строки. alert(‘I\’m Alex!’);// I’m Alex! alert(`I’m Alex!` ); // I’mAlex! |
Jest Tutorial: тестовая структура и первый провальный тест
Время создать свой первый тест Jest. Откройте filterByTerm.spec.js и создайте тестовый блок:
describe("Filter function", () => { // test stuff });
Наш первый друг — describe, метод Jest для содержания одного или нескольких связанных тестов. Каждый раз, когда вы начинаете писать новый набор тестов для функциональности, поместите его в блок describe. Как вы можете видеть, он принимает два аргумента: строку для описания набора тестов и функцию обратного вызова для переноса реального теста.
Далее мы встретимся с другой функцией под названием test, которая является фактическим тестовым блоком:
describe("Filter function", () => { test("it should filter by a search term (link)", () => { // actual test }); });
На данный момент мы готовы написать тест. Помните, что тестирование — это вопрос входных данных, функций и ожидаемых результатов. Сначала давайте определим простые входные данные, массив объектов:
describe("Filter function", () => { test("it should filter by a search term (link)", () => { const input = [ { id: 1, url: "https://www.url1.dev" }, { id: 2, url: "https://www.url2.dev" }, { id: 3, url: "https://www.link3.dev" } ]; }); });
Далее мы собираемся определить ожидаемый результат. Согласно заданию тестируемая функция должна исключать объекты, свойство url которых не соответствует заданному поисковому запросу. Мы можем ожидать, например, массив с одним объектом, с заданной ссылкой в качестве поискового запроса:
describe("Filter function", () => { test("it should filter by a search term (link)", () => { const input = [ { id: 1, url: "https://www.url1.dev" }, { id: 2, url: "https://www.url2.dev" }, { id: 3, url: "https://www.link3.dev" } ]; const output = [{ id: 3, url: "https://www.link3.dev" }]; }); });
И теперь мы готовы написать реальный тест. Мы будем использовать функцию expect и Jest matcher для проверки того, что наша фиктивная (пока) функция возвращает ожидаемый результат при вызове. Вот тест:
expect(filterByTerm(input, "link")).toEqual(output);
Там образом мы определили как мы должны вызывать поисковую функцию в своем коде:
filterByTerm(inputArr, "link");
В тесте Jest нужно обернуть вызов функции в expect, которые в сочетании с matcher (функция Jest для проверки выходных данных) выполняет фактические тесты. Вот полный код:
describe("Filter function", () => { test("it should filter by a search term (link)", () => { const input = [ { id: 1, url: "https://www.url1.dev" }, { id: 2, url: "https://www.url2.dev" }, { id: 3, url: "https://www.link3.dev" } ]; const output = [{ id: 3, url: "https://www.link3.dev" }]; expect(filterByTerm(input, "link")).toEqual(output); }); });
(Чтобы узнать больше о Jest matchers, ознакомьтесь с документацией).
Запустим наш тест:
npm test
Вы увидите что тест не проходит:
FAIL __tests__/filterByTerm.spec.js Filter function ✕ it should filter by a search term (2ms) ● Filter function › it should filter by a search term (link) ReferenceError: filterByTerm is not defined 9 | const output = [{ id: 3, url: "https://www.link3.dev" }]; 10 | > 11 | expect(filterByTerm(input, "link")).toEqual(output); | ^ 12 | }); 13 | }); 14 |
«ReferenceError: filterByTerm is not defined. Это хорошая вещь на самом деле. Давайте исправим это в следующем разделе!
Работа с подстроками
Рассмотрим функции для работы с подстроками.
-
slice(start, ) — возвращает символы, между конкретных позиций.
let s = '0123456789'; let s_new = s.slice(0, 4); console.log(s_new); // 0123
Если второй параметр не указан, то вернет всё до конца строки.
-
substring(start, ) — работает аналогично. Отличие от «slice» в 2 моментах. Если стартовое значение больше конечного, то первая функция вернет пустую строку.
let s = '0123456789'; console.log(s.slice(6, 4)); // '' console.log(s.substring(6, 4)); // 45
Ещё различие в подходе при неверных параметрах.
let s = '0123456789'; console.log(s.slice(-4, -2)); // 67 console.log(s.substring(-4, -2)); // ''
Функция «slice()» конвертирует отрицательные значения в положительные, отталкиваясь от длины строки, а «substring()» просто устанавливает их в ноль, поэтому возвращает пустую строку.
-
substr(start, ) — возвращает подстроку, начиная с определенной позиции и определенной длины.
let s = '0123456789'; let s_new = s.substr(4, 3); console.log(s_new); // 456
Заключение
Тестирование — это большая и увлекательная тема. Существует множество типов тестов и множество библиотек для тестирования. В этом руководстве Jest вы узнали, как настроить Jest для отчетов о покрытии, как организовать и написать простой модульный тест и как тестировать код JavaScript.
Чтобы узнать больше о UI тестировании, я настоятельно рекомендую взглянуть на JavaScript End to End Testing with Cypress.
Даже если это не связано с JavaScript, я также предлагаю прочитать Test-Driven Development with Python от Гарри Персиваля. Он полон советов и подсказок по всем вопросам тестирования и подробно описывает все виды тестов.
Если вы готовы сделать скачок и узнать об автоматизированном тестировании и непрерывной интеграции, то Automated Testing and Continuous Integration in JavaScript для вас.
Вы можете найти код для этого урока на Github: getting-started-with-jest, а также решение для упражнений.
Спасибо за чтение и следите за обновлениями!
Spread the love