Код: Выделить всё
class MyClass:
def __init__(self):
self.fetched_data = False
def get_data(self):
self.fetched_data = True
return [1, 2, 3]
Код: Выделить всё
from MyClass import MyClass
def do_data_calculations():
my_class = MyClass()
data = my_class.get_data()
print(data)
print(f"Data fetched: {my_class.fetched_data}")
return True
< /code>
Это код, который я получил, и я не могу его изменить. Я пишу модульные тесты для него, используя пакет nuritthest
from function_to_test import do_data_calculations
import unittest
from unittest.mock import patch
def get_data_side_effect(self):
self.fetched_data = True
return [10, 9, 8]
@patch('function_to_test.MyClass.get_data')
class TestMyClass(unittest.TestCase):
def test_greet(self, mock_get_data):
mock_get_data.side_effect = get_data_side_effect
do_data_calculations()
self.assertTrue(mock_get_data.called)
if __name__ == "__main__":
unittest.main()
< /code>
Запуск Unittest Я получаю ошибку < /p>
Traceback (most recent call last):
File "C:\Users\user4219\AppData\Local\miniconda3\envs\azure\lib\unittest\mock.py", line 1379, in patched
return func(*newargs, **newkeywargs)
File "c:\Users\user4219\source\projects\mockingtest\test_function.py", line 14, in test_greet
do_data_calculations()
File "c:\Users\user4219\source\projects\mockingtest\function_to_test.py", line 5, in do_data_calculations
data = my_class.get_data()
File "C:\Users\user4219\AppData\Local\miniconda3\envs\azure\lib\unittest\mock.py", line 1114, in call
return self._mock_call(*args, **kwargs)
File "C:\Users\user4219\AppData\Local\miniconda3\envs\azure\lib\unittest\mock.py", line 1118, in _mock_call
return self._execute_mock_call(*args, **kwargs)
File "C:\Users\user4219\AppData\Local\miniconda3\envs\azure\lib\unittest\mock.py", line 1179, in _execute_mock_call
result = effect(*args, **kwargs)
TypeError: get_data_side_effect() missing 1 required positional argument: 'self'
< /code>
Когда я читаю документацию, кажется, что побочный эффект получает параметры, с помощью которых вызывается функция. Но когда я попробую это, это не так. Держите его на уровне классов (и я не могу использовать новую линию = Callable, поскольку каждая функция должна вызывать ее с разными параметрами).
Как я могу изменить это, чтобы применить побочные эффекты к экземпляру класса?
Подробнее здесь: https://stackoverflow.com/questions/796 ... ted-in-a-f