Не видя реальный код, что трудно угадать, однако я буду делать некоторые предположения:
- Логика в статических методах является детерминированным.
- После выполнения некоторых вычислений на входном значении появляется результат , и с этим результатом выполняется некоторая операция.
- python3.4 (макет эволюционировала и переехала в течение последних нескольких версий)
Для того, чтобы проверить код один должен проверить, что по крайней мере, в конце концов, он производит ожидаемые результаты. Если нет возвращаемого значения, результат обычно сохраняется или отправляется где-то. В этом случае мы можем проверить, что метод, который хранит или отправляет результат, вызывается с ожидаемыми аргументами.
Это может быть сделано с помощью инструментов, доступных в пакете mock
, который стал частью пакета unittest
.
например. следующий статический метод в my_package/my_module.py
:
import uuid
class MyClass:
@staticmethod
def my_procedure(value):
if isinstance(value, str):
prefix = 'string'
else:
prefix = 'other'
with open('/tmp/%s_%s' % (prefix, uuid.uuid4()), 'w') as f:
f.write(value)
В тестовом модуле я проверить следующее:
open
был назван.
- Ожидаемое имя файла было рассчитано.
open
был вызван в write
режиме.
- Метод дескриптора файла был вызван с ожидаемым аргументом.
UnitTest:
import unittest
from unittest.mock import patch
from my_package.my_module import MyClass
class MyClassTest(unittest.TestCase):
@patch('my_package.my_module.open', create=True)
def test_my_procedure(self, open_mock):
write_mock = open_mock.return_value.write
MyClass.my_procedure('test')
self.assertTrue(open_mock.call_count, 1)
file_name, mode = open_mock.call_args[0]
self.assertTrue(file_name.startswith('/tmp/string_'))
self.assertEqual(mode, 'w')
self.assertTrue(write_mock.called_once_with('test'))
Просто вызовите функцию без каких-либо утверждений. Если это исключает исключение, тест завершится неудачей. – zvone
Итак, если процедура _doesn't_ вызывает исключение, это удалось? Затем просто вызовите процедуру _without_ try/catch wrapper. –
Да; если процедура * не * вызывает исключение, это удалось. Если возникает исключение, оно захватывается другими классами, которые используют процедуры. Таким образом, любое исключение будет выбрано методом unittest, если произойдет что-то плохое. – daniel451