У мене є купа класів, які займаються валідацією значень. Наприклад, 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на будь-якій мові, яка вважає одиницю стандартним типом даних замість чогось магічного спеціального випадку. На жаль, він просто повертає одиницю і більше нічого не робить.