У мене є купа класів, які займаються валідацією значень. Наприклад, RangeValidator
клас перевіряє, чи є значення у вказаному діапазоні.
Кожен клас валідатора містить два способи: is_valid(value)
який повертає True
або False
залежно від значення, і ensure_valid(value)
який перевіряє вказане значення, або не робить нічого, якщо значення дійсне, або викидає конкретний виняток, якщо значення не відповідає заданим правилам.
Наразі з цим методом пов’язано два одиничні тести:
Той, який передає недійсне значення, і забезпечує викид виключення.
def test_outside_range(self): with self.assertRaises(demo.ValidationException): demo.RangeValidator(0, 100).ensure_valid(-5)
Той, який передає дійсне значення.
def test_in_range(self): demo.RangeValidator(0, 100).ensure_valid(25)
Хоча другий тест виконує свою роботу - не вдається, якщо виняток викинуто, і успішний, якщо ensure_valid
нічого не кидає - факт, що assert
всередині немає немає , виглядає дивним. Хтось, хто читає такий код, негайно запитає себе, чому існує тест, який, здається, нічого не робить.
Це сучасна практика при методах тестування, які не повертають значення і не мають побічних ефектів? Або я повинен переписати тест по-іншому? Або просто покласти коментар, що пояснює, що я роблю?
self
довідки) і не повертає результату, це не є чистою функцією.
void
багатьма мовами і має нерозумні правила.) Або ви можете мати нескінченну кількість цикл (який працює навіть тоді, коли "не повертає результату" насправді означає, що результатів немає)
unit -> unit
на будь-якій мові, яка вважає одиницю стандартним типом даних замість чогось магічного спеціального випадку. На жаль, він просто повертає одиницю і більше нічого не робить.