### Почему Mocha, а не Jasmine?
Ниже будут приведены аргументы в пользу выбора `Mocha`
* Высокая популярность:
— 4m против 400k загузок в месяц
* Высокая активность:
— 1 890 против 1400 коммитов (всего)
— 171 против 101 коммитов (последний год)
— 1228 против 698 тасков
— 835 против 329 пул-реквестов
— 251 против 115 контрибьютеров
* Документацию `Jasmine` требуется изучать по исходным кодам?!
* Минимальное количество глобальных переменных
*Mocha*
`describe`, `xdescribe`, `it`, `xit`, `before`, `beforeEach`, `after`, `afterEach`
*Jasmine*
`context`, `describe`, `fdescribe`, `xdescribe`, `xit`, `fit`, `it`, `jasmine`, `expect`, `not`, `before`, `beforeEach`, `after`, `afterEach`, `afterAll`, `beforeAll`, `spyOn`, ~~`waitsFor`~~, ~~`runs`~~
* У `Jasmine` раздутый, но в тоже время ограниченный набор ассертов
*Jasmine*
```js
expect(1).toBeGreaterThan(10)
```
*Mocha + Chai*
```js
1.above(10);
```
На самом деле, *Jasmine* тоже можно [заставить](https://www.npmjs.com/package/chai-jasmine) работать с *Chai*, но это будет оверхед.
Вопреки расхожему мнению, `Mocha` проигрывает `Jasmine` из-за отсутствия встроенных ассертов, однако это не совсем так. В `Node` есть стандартный модуль [`assert`](https://nodejs.org/api/assert.html), который более чем полностью удовлетворяет базовые потребности:
```js
var assert = require('assert');
it('Execute a particular test case', function () {
assert.equal(0, 1);
});
```
* Использование `Chai` может быть оправдано когда интерфейс построен на промисах:
*Mocha + WebdriverIO + Chai*
```js
it('Проверка портальной авторизации', function *() {
yield browser
.open('/user/login')
.wait(() => {
return browser.execute(() => {
return window.__PH && window.__PH.activeUser();
})
.then(result => result.value);
})
.expect.eventually.equal(object.user.email)
});
```
*Jasmine + WebdriverIO*
```js
it('Проверка портальной авторизации', function () {
browser
.open('/user/login')
.wait(() => {
return browser.execute(() => {
return window.__PH && window.__PH.activeUser();
})
.then(result => result.value);
})
.then(function (result) {
expect(result).toBeEqual(object.user.email);
})
;
});
```
* `Mocha` поддерживает `Growl`-нотификацию
* `Mocha` производит временные замеры каждого теста и подсвечивает наиболее медленные
* `Mocha` имеет собственный вотчер файлов
* `Mocha` дает прекрасные возможности для отладки кода — дебаггер, профайлер и трейсер вызова функций
* `Mocha` дает возможность прокинуть глобальные переменные
* `Mocha` дает возможность конфигурировать время выполнения каждого теста
* `Mocha` поддерживает три вида стандартных интерфейсов — `bdd`, `tdd` и `exports` (`Jasmine` реализует только `bdd`-интерфейс)
* `Mocha` прекрасно интегрируется со сторонними библиотеками типа `Sinon` и `Chai` (без оверхеда как в `Jasmine`)
* `Mocha` показывает диффы!
* `Mocha` позволяет перезапускать зафейленные тесты!
* `Mocha` может запускать выборчно тесты (--grep)
* `Mocha` имеет несколько репортеров (и куча сторонних, в т.ч. [QUnit](http://npmjs.com/package/mocha-qunit-ui))!
* Стоит [поверить а слово](https://github.com/yeoman/yeoman/issues/117)