Комментарии 16
Насчёт асинхронных тестов. Они получаются слишком хрупкими и запутанными. Поэтому вместо асинхронных тестов, я сейчас пишу синхронные вида:
- Выполнили какое-то действие, предварительно застабив внешние зависимости.
- "Промотали" время.
- Проверили результат.
Соответственно, ошибки запроса вываливаются на первом шаге. Ошибки обработки ответа — на втором. Ошибки логики — на третьем. Тесты получаются простыми, понятными и быстрыми.
Я ничего не говорил про таймеры :-) И "промотка" не зря в кавычках. Грубо говоря просто дёргается ручка "запустить следующую партию отложенных задач". Соответственно мок XHR в этом случае запустит обработчики ответа на запрос, предоставив им ответ. Мок Promise — следующий обработчик обещания и тд.
Если замокать все API и таймеры, то тесты действительно получаются простыми, понятными и быстрыми.
Я долго практиковал подход с done(), потом использовал RxJS. В итоге пришёл к простой промотке времени и остался доволен.
Да мне пока хватает своего велосипеда. Пример теста:
'wait for data'() {
class Test extends $mol_object {
@ $mol_mem()
source( next? : string , prev? : string ) : string {
new $mol_defer( () => {
this.source( void 0 , 'Jin' )
} )
throw new $mol_atom_wait( 'Wait for data!' )
}
@ $mol_mem()
middle() {
return this.source()
}
@ $mol_mem()
target() {
return this.middle()
}
}
const t = new Test
$mol_assert_fail( ()=> t.target().valueOf() , $mol_atom_wait )
$mol_defer.run()
$mol_assert_equal( t.target() , 'Jin' )
} ,
Тестирование в JS становиться все более распространенной практикой
Я даже не знаю, это хорошо или печально. В плане, печально что только сейчас.
это перевод статьи 2015 года. Jest тогда еще не был так популярен.
Но, хороший вопрос, зачем переводить такую старую неактуальную статью?
describe ("breakArray", function() {
describe("Разбиение массива на массивы заданной размерности", function() {
it ("Разбиение массива на массивы по 2 бит", function() {
assert.equal( breakArray([1, 2, 3, 4], 2), [[1, 2], [3, 4]] );
});
});
});
Jasmine vs. Mocha, Chai и Sinon