У меня есть класс с функциями __exit__
и __enter__
, так что я могу использовать его в операторе with, например:
with ClassName() as c:
c.do_something()
Я сейчас пытаюсь написать модульный тест дляпроверить это.По сути, я пытаюсь проверить, что do_something()
был вызван только один раз.
Пример (который я назвал testmocking1
):
class temp:
def __init__(self):
pass
def __enter__(self):
pass
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def test_method(self):
return 1
def fun():
with temp() as t:
return t.test_method()
И мой тест:
import unittest
import test_mocking1
from test_mocking1 import fun
import mock
from mock import patch
class MyTestCase(unittest.TestCase):
@patch('test_mocking1.temp', autospec = True)
def test_fun_enter_called_once(self, mocked_object):
fun()
mocked_object.test_method.assert_called_once()
if __name__ == '__main__':
unittest.main()
Так что я ожидаю, что это пройдет, потому что test_methodбыл вызван ровно один раз в функции fun()
.Но фактический результат, который я получаю:
======================================================================
FAIL: test_fun_enter_called_once (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "<path_to_virtual_env>\lib\site-packages\mock\mock.py", line 1305, in patched
return func(*args, **keywargs)
File "<File_with_test>", line 11, in test_fun_enter_called_once
mocked_object.test_method.assert_called_once()
File "<path_to_virtual_env>\lib\site-
packages\mock\mock.py", line 915, in assert_called_once
raise AssertionError(msg)
AssertionError: Expected 'test_method' to have been called once. Called 0 times.
Как проверить, была ли вызвана функция в классе, который создан с помощью оператора with
(один или несколько раз), и (связанный) как мне установить результаты этих вызовов (используя .side_effect
или .return_value
)?