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

Введение в тестирование жасминового устройства

Жасмин – самая популярная библиотека JS для веб-приложений для тестирования подразделений. В этом руководстве, предназначенном для начинающих, мы представим вам быстрое и полное руководство по тестированию с жасмином. Вы познакомитесь с Жасмином, популярным основанным по поведению тестирования для JavaScript. Мы также увидим

Автор оригинала: Ahmed Bouchefra.

Жасмин – самая популярная библиотека JS для веб-приложений для тестирования подразделений. В этом руководстве, предназначенном для начинающих, мы представим вам быстрое и полное руководство по тестированию с жасмином.

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

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

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

Представляем жасмин

Жасмин Является ли очень популярным поведенческим поведением JavaScript (в BDD, вы пишете тесты перед записью фактического кода) Framework для устройств для тестирования приложений JavaScript. Он предоставляет утилиты, которые могут быть использованы для запуска автоматических тестов как для синхронного, так и для асинхронного кода.

Жасмин имеет много функций, таких как:

  • Это быстро и имеет низкий накладной и без внешних зависимостей.
  • Это батареи включали в себя библиотеку и предлагают все необходимое для тестирования вашего кода.
  • Это доступно как для узла, так и для браузера.
  • Может использоваться с другими языками, такими как Python и Ruby.
  • Это не требует дома.
  • Он обеспечивает чистый и простой понять синтаксис, а также богатый и простым API.
  • Мы можем использовать естественный язык для описания тестов и ожидаемых результатов.

Жасмин – это инструмент с открытым исходным кодом, который доступен в соответствии с лицензией Premissive MIT. Начиная с этой записи последняя основная версия – Жасмин 3.0 который предоставляет новые функции и некоторые изменения нарушения. 2.99 Выпуск Жасмина обеспечит различные пределы амортизации для люксов, которые имеют разное поведение в версии 3.0 Что облегчает разработчикам мигрировать на новую версию.

Вы можете прочитать о новых функциях и изменения изменения из этого Документ Отказ

Используя жасмин

Вы можете использовать жасмин во многих отношениях:

  • В старых способов, включая ядро жасмина, так и ваши тестовые файлы с помощью PT> Тег,
  • Как инструмент CLI с использованием Node.js,
  • Как библиотека в Node.js,
  • Как часть системы сборки, такую как Gulp.js или grunt.js через Грунт-Вклад-Жасмин и Gulp-Jasmine-браузер

Вы также можете использовать Jasmine для тестирования вашего кода Python с Жасмин-П.Y которые могут быть установлены из Pypi, используя Пип Установите жасмин команда. Этот пакет содержит оба веб-сервера, который обслуживает и выполняет Jasmine Suite для вашего проекта и скрипта CLI для выполнения тестов и непрерывных интеграций.

Жасмин также доступен для проектов Ruby Via Жасмин-Гемм которые могут быть установлены путем добавления Gem 'Jasmine' к вашему демфажу и бегу Установите комплект Отказ Он включает в себя сервер для обслуживания и запуска тестов, скрипт CLI, а также генераторы для Ruby on Rails Projects.

Теперь давайте сосредоточимся на том, как использовать Jasmine с JavaScript:

Используя автономный жасмин

Начните с загрузки последней версии Жасмина из релизы страница.

Затем просто извлекайте ZIP-файл, предпочтительно внутри папки в проекте, который вы хотите проверить.

Папка будет содержать кучу файлов и папок по умолчанию:

/SRC : Содержит исходные файлы, которые вы хотите проверить. Это может быть либо удалено, если у вас уже есть настройка папки вашего проекта или также может использоваться при необходимости для хостинга вашего исходного кода.

/lib : содержит основные файлы жасмина.

/Спец : Содержит тесты, которые вы собираетесь написать.

SPECRUNNER.HTML : Этот файл используется в качестве тестового бегуна. Вы запускаете свои спецификации, просто запуская этот файл.

Это содержание по умолчанию SPECRUNNER.HTML файл:





  
  Jasmine Spec Runner v3.2.1

  
  

  
  
  

  
  
  

  
  
  




Помните, что вам нужно изменить файлы, включенные из /SRC и /Спец Папки для содержания ваших фактических источников и тестовых файлов.

Используя жасмин как библиотека

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

var Jasmine = require('jasmine');
var jasmine = new Jasmine();

jasmine.loadConfigFile('spec/support/jasmine.json');

jasmine.execute();

Сначала мы требуем/импортируем жасмин, и мы используем loadconfigfile () Способ для загрузки файла конфигурации, доступный из Спецификация/поддержка/Jasmine.json Путь, наконец, мы исполняем жасмин.

Используя жасмин через CLI

Вы также можете использовать жасмин из CLI, который позволяет легко запускать жасминовые тесты и по умолчанию выводит результаты в терминале.

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

npm install -g jasmine

Теперь создайте папку для вашего проекта и навигация внутри него:

$ mkdir jasmine-project $ cd jasmine-project

Далее запустите следующую команду для инициализации вашего проекта для Jasmine:

Эта команда просто создает папку Specker и файл конфигурации JSON. Это выход Дир команда:

.
└── spec
    └── support
        └── jasmine.json

2 directories, 1 file

Это содержание по умолчанию Jasmine.json файл:

{
  "spec_dir": "spec",
  "spec_files": [
    "**/*[sS]pec.js"
  ],
  "helpers": [
    "helpers/**/*.js"
  ],
  "stopSpecOnExpectationFailure": false,
  "random": true
}
  • SPEC_DIR : Указывает, где жасмин ищет тестовые файлы.
  • spec_files : Определяет шаблоны тестовых файлов, по умолчанию все файлы JS, которые заканчиваются Спец или Спец строки.
  • помощники : Указывает, где жасмин ищет вспомогательные файлы. Файлы HELPER выполнены перед спецификацией и могут использоваться для определения пользовательских сопоставлений.
  • StopSpeconexpectationFailure : При установлении True будет немедленно остановить спецификацию в первом отказе ожидания (можно использовать в качестве опции CLI через --stop-on-inshire ).
  • Случайные : При установлении True Jasmine Pseudo-случайно запускает тестовые случаи (можно использовать в качестве опции CLI через --random ).

spec_files и помощники Массивы также могут содержать Шаблон Узор (благодаря узору узел-глобует пакет) для указания путей файлов, которые являются шаблонами, которые вы обычно используете для уточнения набора файлов при работе в Bash (например, ls * .js ).

Если вы не используете местоположение по умолчанию для Jasmine.json Файл конфигурации, вам просто нужно указать пользовательское местоположение через Жасмин --конфиг вариант.

Вы можете найти больше вариантов CLI от официального Документы Отказ

Понимание жасмина

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

В папке вашего проекта запустите следующую команду, чтобы инициализировать новый модуль узла:

Это создаст Package.json Файл с информацией по умолчанию:

{
  "name": "jasmine-project",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

Далее создайте index.js Файл и добавьте следующий код:

function fibonacci(n){

    if (n === 1) {
        return [0, 1];
    }
    else {
        var s = fibonacci(n - 1);
        s.push(s[s.length - 1] + s[s.length - 2]);
        return s;
    }
}
function isPrime(num){
    for (let i = 2; i < num; i++)
        if (num % i === 0) return false;
    return num !== 1 && num !== 0;
}
function isEven(n) {
    return n % 2 == 0;
}
function isOdd(n) {
    return Math.abs(n % 2) == 1;
}

function toLowerCase(str){
    return str.toLowerCase();
}
function toUpperCase(str){
    return str.toUpperCase();
}
function contains(str, substring, fromIndex){
    return str.indexOf(substring, fromIndex) !== -1;
}
function repeat(str, n){
    return (new Array(n + 1)).join(str);
}

module.exports = {
    fibonacci: fibonacci,
    isPrime: isPrime,
    isEven: isEven,
    isOdd: isOdd,
    toLowerCase: toLowerCase,
    toUpperCase: toUpperCase,   
    contains: contains,
    repeat: repeat
};

Люксы

Люкс группы набор спецификаций или тестовых случаев. Он используется для проверки определенного поведения кода JavaScript, которое обычно инкапсуется объектом/классом или функцией. Это создано с помощью глобальной функции жасмина Опишите () Это принимает два параметра, название тестового набора и функция, которая реализует фактический код тестового набора.

Давайте начнем с создания нашего первого тестового набора. Внутри Спец Папка Создать Myjsutilitiesspec.js Файл и добавить:

describe("MyJSUtilities", function() { /* ... */ });

MyJsUtitays это название этого тестового номера верхнего уровня.

Как группировать и гнездо

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

describe("String Utils", function() { /*...*/});describe("Math Utils", function() { /*...*/});

Внутри Математики Люкс, давайте также добавим два вложенных люкса:

describe("Basic Math Utils", function() {   /* ... */ }); describe("Advanced Math Utils", function() {   /* ... */ });

Мы группируем связанные тесты на тесты для СТЕНКА UTILS , Основные математики Utils и Расширенные математики и вложить их в тестовый люкс верхнего уровня MyJsUtitays Отказ Это составят ваши спецификации как деревья, похожие на структуру папок.

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

Как исключить люксы

Вы можете временно отключить набор, используя xdescribe () функция. Он имеет одинаковую подпись (параметры) как Опишите () Функция, которая означает, что вы можете быстро отключить ваши существующие люксы, просто добавив х к функции.

Спецификации в пределах xdescribe () Функция будет отмечена в ожидании и не выполнена в отчете.

Спецификация

Спецификация объявляет тестовый случай, который принадлежит к тестовому номеру. Это делается путем вызова глобальной функции жасмина Это () Это требует двух параметров, название спецификации (которое описывает логику, которую мы хотим проверить) и функцию, которая реализует фактический тестовый случай.

Спецификация может содержать одно или несколько ожиданий. Каждое ожидание – это просто утверждение, которое может вернуть либо правда или ложь Отказ Для того, чтобы специфические были пройдены, все ожидания, принадлежащие к спецификации, должны быть правда В противном случае SPEC не удается.

Внутри нашего СТЕНКА UTILS Люкс, добавьте эти спецификации:

describe("String Utils", function() {  it("should be able to lower case a string",function() {    /*...*/  });  it("should be able to upper case a string",function() {    /*...*/  });  it("should be able to confirm if a string contains a substring",function() {    /*...*/  });  it("should be able repeat a string multiple times",function() {    /*...*/  });});

Внутри нашего Основные математики Utils Suite Давайте добавим некоторые спецификации:

describe("Basic Math Utils", function() {  it("should be able to tell if a number is even",function() {    /*...*/  });     it("should be able to tell if a number is odd",function() {    /*...*/  });     });

Для Расширенные математики Давайте добавим спецификации:

describe("Advanced Math Utils", function() {  it("should be able to tell if a number is prime",function() {    /*...*/  });   it("should be able to calculate the fibonacci of a number",function() {    /*...*/  }); });

Как исключить спецификации

Также как люксы, вы также можете исключить отдельные спецификации, используя XIT () Функция, которая временная отключает Это () SPEC и отмечает спецификацию как ожидание.

Ожидания

Ожидания создаются с использованием Ожидайте () Функция, которая принимает значение под названием фактический (Это могут быть значения, выражения, переменные, функции или объекты и т. Д.). Ожидания составляют спецификацию и используются наряду с функциями сопоставлений (через цепочку), чтобы определить, что ожидает разработчика из определенного блока кода для выполнения.

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

Вы можете цепить Ожидайте () Функция с несколькими списками. Чтобы отрицать/инвертировать логический результат любого сопоставления, вы можете использовать не Ключевое слово перед вызовом подзагонка.

Давайте реализуем спецификации нашего примера. На данный момент мы будем использовать мы будем использовать Ожидайте () с ничего () Matcher, который является частью встроенных почтовых списков, которые мы увидим немного позже. Это пройдет все спецификации, так как мы ничего не ожидаем.

describe("MyJSUtilities", function() {describe(">String Utils", function() {  it("should be able to lower case a string",function() {    expect().nothing();  });  it("should be able to upper case a string",function() {    expect().nothing();  });  it("should be able to confirm if a string contains a substring",function() {    expect().nothing();  });  it("should be able repeat a string multiple times",function() {    expect().nothing();  });     });describe("Math Utils", function() { describe("Basic Math Utils", function() {  it("should be able to tell if a number is even",function() {    expect().nothing();  });     it("should be able to tell if a number is odd",function() {    expect().nothing();  });    }); describe("Advanced Math Utils", function() {  it("should be able to tell if a number is prime",function() {    expect().nothing();  });   it("should be able to calculate the fibonacci of a number",function() {    expect().nothing();  });     }); });});

Это скриншот результатов в данный момент:

У нас есть восемь пройденных спецификаций и нулевых сбоев.

Вы можете либо использовать встроенные списы или создавать собственные пользовательские партнеры для ваших конкретных потребностей.

Встроенные спички

Жасмин обеспечивает богатый набор встроенных подписок. Давайте посмотрим некоторые из важных:

  • Тобе () Для тестирования на идентичность,
  • Tobenull () Для тестирования на null ,
  • FOBEDENDINGED ()/ВЕДЕРЫ () Для тестирования на undefined /не undefined ,
  • Tobenan () Для тестирования на NAN (не число)
  • Товарный () Для тестирования на равенство,
  • TOBEFALLY ()/TOBEROUTYY () Для тестирования на фальсию/правдивость и т. Д.

Вы можете найти полный список партнеров из Документы Отказ

Давайте теперь реализуем наши спецификации с некоторыми из этих подходящих компьютеров. Первый импорт функций, которые мы тестируем в нашем Myjsutilitiesspec.js файл:

const utils = require("../index.js");

Далее начните с СТЕНКА UTILS Люкс и изменить ожидать (). Ничего () с соответствующими ожиданиями.

Например, для первого спецификации мы ожидаем, что Толкание () Метод будет сначала определить и во-вторых, чтобы вернуть строку строчной буквы I.E:

it("should be able to lower case a string",function() {        expect(utils.toLowerCase).toBeDefined();        expect(utils.toLowerCase("HELLO WORLD")).toEqual("hello world");  });

Это полный код для Suite:

describe(">String Utils", function() {  it("should be able to lower case a string",function() {    expect(utils.toLowerCase).toBeDefined();    expect(utils.toLowerCase("HELLO WORLD")).toEqual("hello world");  });  it("should be able to upper case a string",function() {    expect(utils.toUpperCase).toBeDefined();    expect(utils.toUpperCase("hello world")).toEqual("HELLO WORLD");  });  it("should be able to confirm if a string contains a substring",function() {    expect(utils.contains).toBeDefined();    expect(utils.contains("hello world","hello",0)).toBeTruthy();  });  it("should be able repeat a string multiple times",function() {    expect(utils.repeat).toBeDefined();    expect(utils.repeat("hello", 3)).toEqual("hellohellohello");  });     });

Пользовательские партнеры

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

Например, давайте сделаем следующие спецификации:

it("should be able to tell if a number is even",function() {    expect(utils.isEven).toBeDefined();    expect(utils.isEven(2)).toBeTruthy();    expect(utils.isEven(1)).toBeFalsy();  });

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

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

Мы создаем пользовательские партнеры, используя addmatchers () Способ, который принимает объект, состоящий из одного или многих свойств, которые будут добавлены в качестве сопоставлений. Каждое свойство должно предоставить заводскую функцию, которая принимает два параметра: Util , который имеет набор полезных функций для партнеров для использования (см.: Matchersutil.js ) и CustomequalityTesters который должен быть передан, если Util.equals называется и должен вернуть объект с Сравнить Функция, которая будет призвана проверить ожидание.

Нам нужно зарегистрировать пользовательский помощник перед выполнением каждого спецификации, используя Rebedeach () Метод:

describe("/Basic Math Utils", function () {beforeEach(function () {jasmine.addMatchers({hasEvenMethod:  function (util, customEqualityTesters) {return {compare:  function (actual, expected) {var  result  = { pass:  utils.isEven  !==  undefined };if (result.pass) {result.message  =  "Expected isEven() to be not defined."}else {result.message  =  "Expected isEven() to be defined."}return  result;}}}});});/*...*/});

Затем мы можем использовать пользовательский сопоставитель вместо ожидать (utils.iseven) .tobedefined () :

expect().hasEvenMethod();

Это даст нам лучшее сообщение о неудаче:

Использование Rodeeach () и Upoteach ()

Для инициализации и очистки ваших спецификаций Жасмин предоставляет две глобальные функции, Rebedeach () и Upoted () :

  • Rebedeach Функция вызывается один раз перед каждым спецификацией в пакете, где он называется.
  • ДОПОЛЮЧЕНИЕ Функция называется один раз после каждого спецификации в пакете, где он называется.

Например, если вам нужно использовать любые переменные в вашем тестовом наборе, вы можете просто заявить их в начале Опишите () Функция и поставить любую инициализацию или код мгновения внутри Rebedeach () функция. Наконец, вы можете использовать Upoted () Функция Чтобы сбросить переменные после каждого спецификации, поэтому вы можете иметь тестирование чистого блока без необходимости повторять инициализацию и код очистки для каждого спецификации.

Rebedeach () Функция также идеально сочетается со многими аписом жасмина, таких как addmatchers () Способ создания пользовательских сопоставлений или также с сделано () Функция ждать асинхронных операций перед продолжением тестирования.

Неспособность теста

Вы можете заставить тест выйти из строя, используя глобальный потерпеть неудачу () Метод доступен в жасмин. Например:

it("should explicitly fail", function () { fail('Forced to fail'); });

Вы должны получить следующую ошибку:

Тестирование для исключения

Когда вы тестируете единичное тестирование вашего кода, ошибки и исключения, возможно, брошены, поэтому вам может потребоваться проверить эти сценарии. Жасмин обеспечивает TOTHROW () и TOTHROWERROR () Соответствует, чтобы проверить, когда исключение брошен или тестирование на определенное исключение, соответственно.

Например, если у нас есть функция, которая бросает Типеррор исключение:

function throwsError() { throw new TypeError("A type error"); }

Вы можете написать спецификацию, чтобы проверить, если исключение брошен:

it('it should throw an exception', function () { expect(throwsError).toThrow(); });

Или вы также можете использовать тест для конкретных Типеррор исключение:

it('it should throw a TypeError', function () { expect(throwsError).toThrowError(TypeError); });

Понимание шпионов

Чаще всего, чем нет, методы зависят от других методов. Это означает, что, когда вы тестируете метод, вы также можете получить тестирование его зависимостей. Это не рекомендуется в тестировании I.e. Вы должны убедиться, что вы проверяете чистую функцию, изолируя метод и видим, как он ведет себя с учетом набора входов.

Жасмин предлагает Шпионы Что можно использовать для шпионажа/прослушивания к способу вызовов на объектах и отчете, если метод называется и с каким контекстом и аргументами.

Жасмин обеспечивает два способа шпионажа по вызовам метода: используя Spyon () или Createpty () методы.

Вы можете использовать Spyon () Когда метод уже существует на объекте, в противном случае вам нужно использовать Jasmine.Createspy () который возвращает новую функцию.

По умолчанию SPY будет сообщать только в том случае, если вызов был сделан без вызова сквозной функции (I.e, функция прекратится выполнением), но вы можете изменить поведение по умолчанию, используя эти методы:

  • и. CallThrough () : Позвоните через оригинальную функцию,
  • и. Возрождение (значение) : верните указанное значение,
  • and.callfake (FN) : позвоните поддельной функцией вместо оригинального,
  • и. Потребитель (err) : бросить ошибку,
  • и.stub () : Сбрасывает поведение по умолчанию.

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

Скажем, мы хотим убедиться, что наш ToupPercase () Метод использует встроенный String.touppercass () Метод, нам нужно просто шпионить на String.touppercass () с использованием:

it("should be able to upper case a string", function () { 
var spytoUpperCase = spyOn(String.prototype, 'toUpperCase') 
expect(utils.toUpperCase).toBeDefined(); expect(utils.toUpperCase("hello world")).toEqual("HELLO WORLD"); expect(String.prototype.toUpperCase).toHaveBeenCalled(); expect(spytoUpperCase.calls.count()).toEqual(1); });

Тест не удался из-за второго ожидания, потому что Utils.touppercass («Hello World») возвращено неопределенным вместо ожидаемых ПРИВЕТ МИР. Это потому, что, как мы упоминали, ранее после создания шпиона на ToupPercase () Способ не выполняется. Нам нужно изменить это поведение по умолчанию, позвонив Chinthrough () :

var spytoUpperCase = spyOn(String.prototype, 'toUpperCase').and.callThrough();

Теперь все ожидания проходят.

Вы также можете использовать and.callfake () или и. Возрождение () Подделать либо зачету на функцию или просто возвращаемое значение, если вы не звоните через фактическую функцию:

var spytoUpperCase = spyOn(String.prototype, 'toUpperCase').and.returnValue("HELLO WORLD"); 
var spytoUpperCase = spyOn(String.prototype, 'toUpperCase').and.callFake(function(){ return "HELLO WORLD"; });

Теперь, если мы в конечном итоге не используем встроенные String.touppercass () в нашем собственном Utils.touppercase () Реализация, мы получим эти сбои:

Два ожидания ждите (string.prototype.touppercase) .tohavebeencalled () ждите (spytouppercass.calls.Count ()). Товары (1) провалился.

Как бороться с асинхроникостью в жасмине

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

По умолчанию жасмин ждет любую асинхронную операцию, определяющую обратный вызов, обещание или async ключевое слово, быть законченным. Если жасмин находит обратный вызов, обещать или async ключевое слово в одной из этих функций: Rebedeach , ДОПОЛЮЧЕНИЕ , BeForall , Послеобеда и Это Он будет ждать, пока асинхронный, который будет сделан, прежде чем приступить к следующей операции.

Использование сделано () с debedeach ()/it () ..

Давайте возьмем наш пример Simulateasyncop () которые имитирует асинхронную работу, используя Setimeout () Отказ В сценарии реального мира это может быть запрос AJAX или любые, подобные, что происходит асинхронно:

function simulateAsyncOp(callback){ 
setTimeout(function () { callback(); }, 2000); }

Чтобы проверить эту функцию, мы можем использовать Rebedeach () Функция со специальными сделано () перезвонить. Наш код должен вызывать сделано () Сказать жасмин, что асинхронная операция завершилась:

describe("/Async Op", function () {var  asyncOpCompleted  =  false;beforeEach(function (done) {utils.simulateAsyncOp(function(){  asyncOpCompleted  =  true;  done();});});it("should be able to tell if the async call has completed", function () {  expect(asyncOpCompleted).toEqual(true);});});

Мы можем быстро заметить недостаток этого метода, поэтому нам нужно написать наш код, чтобы принять сделано () перезвонить. В нашем случае мы не были жесткокированы сделано () Метод в нашем Simulateasyncop (FN) Но мы предоставили параметр обратного вызова просто чтобы позвонить сделано () Отказ

Используя обещания

Если вы не хотите создавать код, который зависит от того, как вы пишете тест, вы можете воспользоваться обещанием и позвонить в сделано () Обратный вызов, когда обещание разрешило. Или еще лучше, на Жасмине 2.7+, если ваш код возвращает Обещание Жасмин будет ждать, пока он не будет разрешен или отклонен перед выполнением следующего кода.

Используя async/ждать

Жасмин 2.7+ поддерживает async и ждать звонки в спецификации. Это снимает вас от поставок в оформлении в .then () или .catch () блокировать.

it("should work with async/await", async () => { let completed = false; completed = await utils.simulateAsyncOp(); expect(completed).toEqual(true); });

Это реализация Simulateasyncop :

function simulateAsyncOp() { 
return new Promise(resolve => { setTimeout(() => { resolve(true); }, 1000); }); }

Используя жасмин часов

Часы жасмина используются для тестирования асинхронного кода, который зависит от времени, таких как Setimeout () Точно так же мы проверяем синхронный код путем издевательства на основе времени API с пользовательскими методами. Таким образом, вы можете выполнить тестированные функции синхронно, управляя или вручную продвигая часы.

Вы можете установить гасминовые часы, вызывая Jasmine.Clock (). Установить Функция в вашем спецификации или найте.

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

С жасминовыми часами вы можете управлять JavaScript Сетримс или Setinterval Функции, тикающие часы, чтобы продвинуться во времени, используя jasmine.clock (). Отметьте Функция, которая принимает количество миллисекунд, с которыми вы можете двигаться.

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

beforeEach(function () {jasmine.clock().install();});afterEach(function() {jasmine.clock().uninstall();});it("should call the asynchronous operation synchronously", function() {var  completed  =  false;utils.simulateAsyncOp(function(){completed  =  true;});expect(completed).toEqual(false);jasmine.clock().tick(1001);expect(completed).toEqual(true);});

Это Simulateasyncop Функция:

function simulateAsyncOp(callback){ 
setTimeout(function () { callback(); }, 1000); }

Обработка ошибок

Если ваш асинхронный код не удается из-за некоторой ошибки, вы хотите, чтобы ваши спецификации не удалились правильно. Начиная с Jasmine 2.6+, любые необработанные ошибки отправляются на выполненные в настоящее время SPEC.

Жасмин также предоставляет, как вы можете использовать, если вам нужно явно отказаться от ваших спецификаций:

  • используя сделано () Обратный вызов с Rebedeach () Призывая deft.fail (err) метод,
  • Просто пропустить ошибку к сделано (Err) Обратный вызов (Жасмин 3+),
  • Призывая Отклонить () Метод Обещание Отказ

Вывод

В этом руководстве мы представили жасмин и видели, как начать работу, используя Jasmine, чтобы проверить свой код JavaScript. Спасибо за чтение!

Это Статья был изначально опубликован в Techiediaries Отказ