Можно ли присвоить side_effect переменной члена класса в python при исправлении с использованием модуля unittest? - PullRequest
0 голосов
/ 19 февраля 2019

Можно ли пропатчить переменную экземпляра класса и заставить ее возвращать другое значение каждый раз, когда на нее ссылаются?в частности, я заинтересован в том, чтобы сделать это с параметром side_effect

  • . Я знаю, что при обновлении метода можно присвоить side_effect фиктивный метод.Если вы установите side_effect в качестве списка, он будет перебирать список, возвращая другое значение при каждом вызове.
  • Я хотел бы сделать то же самое с переменной экземпляра класса, но не могу заставить ее работать, и я не вижу никакой документации, чтобы предположить, возможно ли это или нет

Пример

from unittest.mock import patch

def run_test():
    myClass = MyClass()
    for i in range(2):
        print(myClass.member_variable)

class MyClass():
    def __init__(self):
        self.member_variable = None

@patch('test_me.MyClass.member_variable',side_effect=[1,2], create=True)
def test_stuff(my_mock):
    run_test()
    assert False

Вывод

-------------- Captured stdout call ---------------------------------------------------------------------------------------------------------------------
None
None

Требуемый вывод

-------------- Captured stdout call ---------------------------------------------------------------------------------------------------------------------
1
2
  • Для ясности - я знаю, что могу обернуть member_variable в методе get_member_variable () .Это не мой вопрос.Я просто хочу знать, можете ли вы исправить переменную-член с помощью side_effect.

1 Ответ

0 голосов
/ 20 февраля 2019

side_effect может быть либо функцией, итерируемой, либо исключением (https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.side_effect). Я думаю, что это причина того, почему это не работает.

Другой способ проверить это будет:

>>> class Class:
...     member_variable = None
...
>>> with patch('__main__.Class') as MockClass:
...     instance = MockClass.return_value
...     instance.member_variable = 'foo'
...     assert Class() is instance
...     assert Class().member_variable == 'foo'
...

Вот документы: https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch

...