Такие вещи обычно не тестируются с помощью модульного теста, но вместо этого они будут принудительно применяться с инвариантом класса в методе __init__
:
class Animal:
def __init__(self, name, energy=100):
if not isinstance(name, str):
raise TypeError("name should be a string")
if energy <= 0:
raise ValueError("energy has to be more than 0")
self.name = name
self.energy = energy
Таким образом, вы никогда не сможете даже случайно создать Animal
с недопустимыми значениями в нем.
Конечно, после установки этих инвариантов вы можете проверить, что они действительно на месте. Например, с популярным модулем pytest
:
import pytest
import Animal
def test_init_ok():
animal = Animal("name", 100)
assert animal.name == "name"
assert animal.energy == 100
def test_init_bad_name():
with pytest.raises(TypeError):
animal = Animal(123, 100)
def test_init_bad_energy():
with pytest.raises(ValueError):
animal = Animal("name", 0)
with pytest.raises(ValueError):
animal = Animal("name", -100)
Или с помощью встроенного модуля unittest
:
import unittest
import Animal
class TestAnimal(unittest.TestCase):
def test_init_ok(self):
animal = Animal("name", 100)
self.assertEqual(animal.name, "name")
self.assertEqual(animal.energy, 100)
def test_init_bad_name(self):
with self.assertRaises(TypeError):
animal = Animal(123, 100)
def test_init_bad_energy(self):
with self.assertRaises(ValueError):
animal = Animal("name", 0)
with self.assertRaises(ValueError):
animal = Animal("name", -100)