Jasmine та юніт тести, Stepan Suvorov Blog
Release 2.0

Jasmine та юніт тести
Насамперед завантажуємо бібліотеку з офсайту. Далі створюємо собі пісочницю для експериментів. Разом з бібліотекою одночасно йде приклад використання, але можна відразу розібратися в ньому буде непросто. Простіша версія виглядатиме так:
Відразу модуль для рендер результатів (jasmine-html.js) і підключимо його. Підсумковий код буде таким:
Пісочниця є, тепер можемо переходити до експериментів у tests.js:
* describe може включати інший describe (якщо потрібні підсекції)
далі йде сам тест:
Зрозуміло, що замість true тут буде 2 вирази, які повинні бути рівними. Які можуть бути варіанти для порівняння?
ВідмінністьtoEqual відtoBe у цьому, що toBe – це суворе посилання порівняння (для об'єктів a = b = <> ), а разі toEqual – порівняння за вмістом( a = <>, b = <> У другому випадку toBe повернеfail.
Також можливі варіанти для знаходження збігів підрядка:
Або знаходження якості в об'єкті:
Варіанти перевірки null і undefinded:
Аналогічно працюють методи: toBeTruthy, toBeFalsy, toContain(перевіряє наявність значення в масиві), toBeLessThan, toBeGreaterThan, toBeCloseTo.
Якщо ми захочемо перевірити ім'я класу конструктора (аналог instanceof):
Також є метод перевірки винятків:
У групі тестів ми можемо використовувати інструкціїbeforeEach таafterEach, в яких ми вказуємо, що потрібно виконати до/після кожного тесту:
Групи і тести мають цікаву особливість, якщо ми поставимо перед describe або it символ x, тобто.xdescribe таxit, то вони будуть проігноровані. (При цьомупомилка про те, що метод не знайдено, викликана не буде)
Ще за допомогою Jasmine ми можемо виставлятиспостерігачів (observer) на різні об'єкти за допомогою методуspyOn :
Після цього будуть доступні такі перевірки:
Для методу spyon існує ряд надбудов:
і складніші:
По суті те саме, що і spyOn (foo, 'setBar'), тільки тут ми можемо створювати спостерігач на функцію (як у першому випадку), а не на метод об'єкта і робити це динамічно (формуючи назву функції).
У випадку, коли ми повинні зробити тест через деякий час після запуску тестованого коду, на допомогу нам приходить методjasmine.Clock ( аналог setTimeOut):
А зараз розберемо найскладніше місце у всій бібліотеці - асинхронні тести, які на мою думку дуже слабо розібрані в прикладах на офіційному сайті. Створюються вони за допомогою черг організованих через методи runs () іwaitsFor (). У методruns () ми передаємо наші асинхронні дії, а вwaitsFor () прописуємо умову, за якою ми дізнаємося, що асинхронна дія завершена - зазвичай для цього використовується глобальна змінна, як прапор. Припустимо, у нас є асинхронний метод:
Тепер напишемо тест для нього:
Метод waitsFor має наступний синтаксис:
Отже ще раз: ми поміщаємо наші асинхронні дії в метод runs() і при виконанні цієї дії змінюємо прапор, а в waitsFor() поміщаємо функцію, яка повертатиме цей самий прапор. Причому тут може бути як один прапор, так і більш складні перевірки (наприклад, якщо у нас йде кілька асинхронних викликів).