Я пишу несколько тестов для библиотеки, используя pytest . Я хочу попробовать ряд тестовых случаев для каждой функции, выявленной библиотекой, поэтому мне было удобно группировать тесты для каждого метода в классе. Все функции, которые я хочу проверить, имеют одинаковую подпись и возвращаем аналогичные результаты, поэтому я хотел бы использовать вспомогательный метод, определенный в суперклассе, чтобы сделать некоторые утверждения о результатах. Упрощенная версия будет работать так: < /p>
Код: Выделить всё
class MyTestCase:
function_under_test: Optional[Callable[[str], Any]] = None
def assert_something(self, input_str: str, expected_result: Any) -> None:
if self.function_under_test is None:
raise AssertionError(
"To use this helper method, you must set the function_under_test"
"class variable within your test class to the function to be called.")
result = self.function_under_test.__func__(input_str)
assert result == expected_result
# various other assertions on result...
class FunctionATest(MyTestCase):
function_under_test = mymodule.myfunction
def test_whatever(self):
self.assert_something("foo bar baz")
in assert_something , необходимо вызвать __func __ () на функции, поскольку назначение функции атрибуту класса делает его связанным методом Этот класс - в противном случае Self < /code> будет передаваться как первый аргумент для функции внешней библиотеки, где он не имеет никакого смысла. < /p>
Этот код работает так, как предполагалось. Однако это дает ошибку Mypy: < /p>
Код: Выделить всё
"Callable[[str], Any]" has no attribute "__func__"
< /code>
На основе моей аннотации правильно, что это не безопасная операция: произвольный вызов может не иметь атрибута __func __ < /code>. Тем не менее, я не могу найти аннотацию типа, которая бы указывала на то, что переменная function_under_test
относится к методу и, следовательно, всегда будет иметь __func __ . Я упускаю из виду один, или есть другой способ настроить свои аннотации или доступ, чтобы работать с проверкой типов? обойти это, некоторые из которых могут быть даже чище (используйте любой тип , проверка типа пропуска, используйте частный метод, чтобы вернуть тест на функцию, а не сделать ее переменной класса, сделайте метод помощника функцией, и т. д.). Меня больше интересует, есть ли аннотация или другой трюк Mypy, которая заставит этот код работать.
Подробнее здесь:
https://stackoverflow.com/questions/580 ... und-method