Search
Write a publication
Pull to refresh

Comments 6

Более того, кроме проверки пост условий, часто надо проверять и предусловия. Чтобы не казалось так, что действие ничего не делает, а объект по дефолту уже в нужном состоянии.

Тут более тонкий момент. Вообще, тест должен стартовать из контролируемых условий. Мне сложно представить, в каких случаях юнит-тест будет проводиться с предусловиями, не контролируемыми самим набором сетапов и тестов. Да, это может зависеть от условных переменных окружения, контрактов внешних систем или чего-то подобного, но тогда это уже превращает его в интеграционный тест, а это про другое, всё же оригинальное правило сингл ассерта про юнит-тесты написано. Да и, опять же, если у нас фейлятся предусловия, то мы оказываемся в странной серой зоне, где тест и не успешен, и не провален.

class Foo {
	bar = 1
	increment() {
		this.bar *= 1
	}
}

const foo = new Foo
console.assert( foo.bar === 0 )

foo.increment()
console.assert( foo.bar === 1 )

Ха, вот буквально вчера с этим столкнулся - я когда тесты пишу, всегда проверяю статус до и после сообщения. Чтобы было видно - было так, что-то сделали и в результате стало так. А чел проверял только статус после. Ну и я сначала не стал налегать на него, типа чтобы не душнить, но потом увидел что его сообщение в итоге ни как не обрабатывается. Те по факту статус изначально был такой как и после отправки сообщения. И тогда сказал ему везде проверять до и после.

Если предусловия теста в его начале не создаются тут же в коде явным образом, то предвариельная проверка с заваливанием всего теста из-за несоответствия ожидаемого предсостояния обязательна.

Особенно это важно в интеграционных тестах с БД. Т.к. после выполнения предыдущих тестов состояние может быть вообще не таким, каким его видит автор теста.

КГ/АМ.

иметь только один оператор assert в тесте

А что есть "оператор assert"? По-моему, очевидно, что под оператором понимается законченная проверка какого-либо объекта. Соответственно, если нужно проверить состояние объекта из 100500 полей, то именно это и должно быть выполнено в тесте. Не нравится простыни из assertEquals()/assertThat() - вынеси в отдельный метод assertSomeObjects() и в используй его в тесте.

Sign up to leave a comment.