khusamov
@khusamov
ReactJS, NodeJS, TypeScript, Sencha ExtJS

Как написать тест на выявление ошибки в асинхронной функции?

Как написать тест на выявление ошибки в асинхронной функции?

Этот вариант не работает:

assert.throw(async function() {
	await new Application().load('not-exists/path/to/app');
});


Пока придумал лишь такой вариант:

try {
	await new Application().load('not-exists/path/to/app');
} catch (e) {
	assert.throw(function() {
		throw e;
	});
}


Есть вариант более элегантный?

UPD:
Что конкретно я хочу сделать в данном тесте:
Я на вход load() подаю заведомо неверный путь not-exists/path/to/app.
И мне нужно убедиться, что генерируется исключение.
Также я хочу воспользоваться именно assert.throw().

UPD:
Дело в том, что assert.throw() не позволяет тестировать асинхронные функции. И поэтому пришлось городить через try {} catch. Это странно видеть, потому что в mocha поддержка async/await имеется. Почему ее нет в chai? Или есть, то где она?
  • Вопрос задан
  • 237 просмотров
Пригласить эксперта
Ответы на вопрос 1
lxsmkv
@lxsmkv
Test automation engineer
В чем именно вы хотите убедиться? Какой тип ошибки вы хотите поймать? По определению асинхронная функция совершенно законно может вернуть ошибку если промис не был выполнен в заданный промежуток времени. Тут тест по моему опыту бесполезен.
T.e. нужно спросить себя "какую полезную информацию я получу если этот тест упадет?". Никакой - ваш "невод" может законно вернуться с "тиной морскою". Это природа промиса.
Другое дело если вы хотите убедиться в том что не изменился path. Для этого нужен тест на путь. Вроде test_path_available

Чтобы тест давал полезную информацию должно произойти что-то чего тест не ожидал. Например поменялся интефейс Application и функция load стала называться load_path. Тогда ваш тест отвалится и вы заметите изменение. Проверять что вы получите отказ если вы можете получить отказ - бессмысленно.
Простите что три раза об одном и том же разными словами, но это важный момент при дизайне тестов.
Опять же если вы хотите проверить за какое время вы получаете ответ - это имеет смысл, но это область нагрузочного тестирования.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы