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

Сравнение структуры тестирования JavaScript: Жасмин против Моча

Этот пост является быстрым обзором различий между двумя популярными каркасами тестирования JavaScript: Жасмин 2 и Мока. Мы также обсудим обычно используемые библиотеки, Чай и Синон, которые часто используются в сочетании с жасмином и мокко.

Автор оригинала: Codementor Team.

(фото tdlucas5000. )

Тестирование в JavaScript становится ожидаемым разработчиками все больше и больше. Но где вы начинаете? Там так много шансов. Это может чувствовать себя довольно подавляющим. Этот пост является быстрым обзором различий между двумя популярными каркасами тестирования JavaScript: Жасмин 2 и Моча Отказ Мы также обсудим обычно используемые библиотеки, Чай и Синон , которые часто используются в сочетании с жасмином и мокко.

1. API.

API of Jasmine и Mocha очень похожи, где вы пишете свой тестовый люкс с Опишите Блоки и каждый тест, также называемый спецификацией, используя Это функция.

describe('calculator add()', function() {
  it('should add 2 numbers togoether', function() {
    // assertions here
  });
});

Утверждения, или ожидания, поскольку их часто называют, – это то, где все начинают отличаться. Mocha не имеет встроенной библиотеки утверждения. Есть несколько вариантов, хотя для узема, так и для браузера: Chai, Dox.js, ending.js и лучше-assert. Многие разработчики выбирают Chai в качестве библиотеки их утверждения. Поскольку ни один из этих библиотек утверждений не приходит с Mocha, это еще одна вещь, которую вам нужно будет загрузить в ваш тестовый жгут. Чай поставляется с тремя разными ароматами утверждений. У этого есть Должен Стиль, ожидать стиль и Assert стиль. ожидать Стиль похож на то, что обеспечивает жасмин. Например, если вы хотите написать ожидание, которое проверяет Calculator.add (1, 4) равняется 5, вот как вы сделаете это как с жасмином, так и Chai:

Жасмин

expect(calculator.add(1, 4)).toEqual(5);

Чай

expect(calculator.add(1, 4)).to.equal(5);

Довольно похожее вправо? Если вы переключаетесь с Жасмина в Моча, путь с самым простым кривой обучения – использовать Chai с ожидать стиль. В Жасмине методы утверждений, такие как Товарный () Используйте Case Case, тогда как комплимент в Chai использует точечную обозначение, to.equal () Отказ И жасмин и моча используют Опишите () и Это () Функции.

2. Проверить удваиваться

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

  • Посмотрите, сколько раз шпион называли
  • Укажите возвращаемое значение, чтобы заставить свой код пойти по определенному пути
  • Расскажите шпионку бросить ошибку
  • Посмотрите, какие аргументы шпион вызвали с
  • Расскажите шпион, чтобы вызвать оригинальную функцию (функция, о которой она шпиона). По умолчанию шпион не будет вызывать оригинальную функцию.

В Жасмине вы можете шпионить в существующих методах, как это:

var userSaveSpy = spyOn(User.prototype, 'save');

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

var spy = jasmine.createSpy();

Напротив, Mocha не приходит с тестовой двойной библиотекой. Вместо этого вам нужно будет загрузить в Синоне в свой тестовый жгут. SINON – это очень мощная тестовая двойная библиотека и является эквивалентом жасмина шпионов с небольшим более. Одно следует отметить, что Синон разбивает испытание в два разных категория: Шпионы , заглушки и Макеты каждый с тонкими различиями.

Шпион в Синоне призывает к тому, что следует скрывать метод, в то время как вы должны указать это поведение в жасмине. Например:

spyOn(user, 'isValid').andCallThrough() // Jasmine
// is equivalent to
sinon.spy(user, 'isValid') // Sinon

В вашем тесте оригинал user.isvalid будет называться.

Следующий тип тестирования Double – это заглушка, которая действует как управляемая замена. Круты аналогичны поведению по умолчанию шпионов жасмина, где оригинальный метод не вызывается. Например:

sinon.stub(user, 'isValid').returns(true) // Sinon
// is equivalent to
spyOn(user, 'isValid').andReturns(true) // Jasmine

В вашем коде, если user.isvalid вызывается во время выполнения ваших тестов, оригинал user.isvalid не будет называться и поддельной версией IT (тестовой двойной), которая возвращает правда будет использоваться. В SINON stub – это тестовое двойное, построенное сверху шпионов, поэтому окуты имеют возможность записывать, как используется функция.

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

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

3. асинхронное тестирование

Асинхронное тестирование в жасмина 2.x и Mocha одинаково.

it('should resolve with the User object', function(done) {
  var dfd = new $.Deferred();
  var promise = dfd.promise();
  var stub = sinon.stub(User.prototype, 'fetch').returns(promise);

  dfd.resolve({ name: 'David' });

  User.get().then(function(user) {
    expect(user instanceof User).toBe(true);
    done();
  });
});

Выше, Пользователь является функцией конструктора со статическим методом получить Отказ За кулисами, получить использует извлекать который выполняет запрос XHR. Я хочу утверждать, что когда получить Успешно разрешается, разрешенное значение является экземпляром Пользователь Отказ Потому что я опубликовал User.prototye.fetch Чтобы вернуть предварительно разрешенное обещание, нет реального запроса AJAX. Однако этот код все еще асинхронный.

Просто указывая параметр в Это Функция обратного вызова (я назвал это Готово Как в документации, но вы можете назвать это, что вы хотите), Test Runner пройдет в функции и дождается, пока эта функция выполняется перед завершением теста. Тест будет время ожидания и ошибка, если сделано не вызывается в течение определенного ограничения по времени. Это дает вам полный контроль, когда ваши тесты завершены. Вышеупомянутый тест будет работать как в Mocha, так и в жасмине 2.x.

Если вы работаете с жасмином 1.3, асинхронное тестирование было не так красиво.

Пример жасмин 1.3 асинхронный тест

it('should resolve with the User object', function() {
  var flag = false;
  var david;

  runs(function() {
    var dfd = new $.Deferred();
    var promise = dfd.promise();

    dfd.resolve({ name: 'David' });
    spyOn(User.prototype, 'fetch').andReturn(promise);

    User.get().then(function(user) {
      flag = true;
      david = user;
    });
  });

  waitsFor(function() {
    return flag;
  }, 'get should resolve with the model', 500);

  runs(function() {
    expect(david instanceof User).toBe(true);
  });
});

На этом примере асинхронного теста Жасмин 1.3 Жасмин будет ждать максимум 500 миллисекунд для асинхронной операции для завершения. В противном случае тест провалится. waitsfor () постоянно проверяется, если Флаг становится правдой. Как только это произойдет, он будет продолжать работать следующим Беги () Блок, где у меня есть мое утверждение.

4. Sinon Fake Server

Одна особенность, которую Синон имеет, что жасмин не является поддельным сервером. Это позволяет настроить поддельные ответы на запросы AJAX, выполненные для определенных URL.

it('should return a collection object containing all users', function(done) {
  var server = sinon.fakeServer.create();
  server.respondWith("GET", "/users", [
    200,
    { "Content-Type": "application/json" },
    '[{ "id": 1, "name": "Gwen" },  { "id": 2, "name": "John" }]'
  ]);

  Users.all().done(function(collection) {
    expect(collection.toJSON()).to.eql([
      { id: 1, name: "Gwen" },
      { id: 2, name: "John" }
    ]);

    done();
  });

  server.respond();
  server.restore();
});

В приведенном выше примере, если Получить Запрос сделан в /пользователи 200 ответ, содержащий два пользователей, Гвен и Джон, будут возвращены. Это может быть действительно удобно по нескольким причинам. Во-первых, это позволяет вам проверить ваш код, который делает вызовы AJAX независимо от того, какие библиотеки Ajax вы используете. Во-вторых, вы можете проверить функцию, которая делает Call ajax и делает некоторые предварительную обработку в ответ до того, как обещание разрешится. В-третьих, возможно, есть несколько ответов, которые могут быть возвращены в зависимости от того, что запрос добится успеха или не удается, например, успешная заряда кредитной карты, неверная кредитная карта номера, просроченная карта, неверный CVC и т. Д. Вы получаете идею. Если вы работали с угловым, поддельный сервер Синона похож на $ httpbackend Услуга предоставляется в угловых макетах.

5. Запуск тестов

Mocha поставляется с утилитой командной строки, которую вы можете использовать для запуска тестов. Например:

mocha tests --recursive --watch

Это предполагает, что ваши тесты находятся в каталоге, называемом Тесты Отказ Рекурсивный флаг найдет все файлы в подкаталогах, и флаг Watch будет смотреть все ваши исходные и тестовые файлы и повторить тесты, когда они меняются.

Жасмин, однако, не имеет утилиты командной строки для прохождения тестов. Есть тестовые бегуны для жасмина, а очень популярный – Карма угловой командой. KARMA также позволяет поддержать Mocha, если вы хотите запустить свои тесты Mocha таким образом.

Резюме

В заключение, каркас жасмина имеет почти все встроенное в него, включая утверждения/ожидания и тестируемые двойные утилиты (которые приходят в виде шпионов). Однако у него нет тестового бегуна, поэтому вам нужно будет использовать инструмент, такой как карма для этого. Мокка с другой стороны включает в себя тестовый бегун и API для настройки вашего тестового набора, но не включает в себя утверждение и тестируйте двойные утилиты. Существует несколько вариантов утверждений при использовании Mocha, и Chai имеет тенденцию быть самым популярным. Испытание в Mocha также требует другая библиотеки, и Sinon.js часто является выбором де-факто. Синон также может быть отличным дополнением к вашим тестированным жгуте для его поддельного сервера.

Итак, если вы должны были выбрать настройку тестовой структуры сегодня, что это может выглядеть?

Если вы идете с жасмином, вы, вероятно, будете использовать:

  • Карма (для тестового бегуна)
  • SINON (возможно, для его поддельного сервера, если ваша рамка не обеспечивает эквивалентную, как $ httpбенд Если вы используете угловой)

Если вы идете с Mocha, вы, вероятно, будете использовать:

  • Чай (для утверждений)
  • Синон (для теста удваивается и его поддельный сервер)
  • Карма или моча CLI (для тестового бегуна)

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

об авторе

DAVID TANG – это инженер с полным стеком, увлеченный тестированием, архитектурой приложения и создание отличных пользователей. Дэвид – преподаватель неполный рабочий день для Университета Южной Калифорнии Университета в Университете Южной Калифорнии. Найдите больше советов и трюков Давида на написании журнала JavaScript на Его блог !