我在弄清楚如何使用MagicMock的side_effect属性时遇到了问题,但它似乎只有在我为函数打补丁时才有效。然而,我想修补属性。下面是一个最小的代码示例:
# in calendar.py
class Weeks():
a = property(lambda self: 0)
b = property(lambda self: 0)
c = property(lambda self: 0)
@patch('calendar.Weeks')
def test_something_else(weeks_mock):
weeks_mock.return_value.a.side_effect = [0, 10, 20, 30]
weeks_mock.return_value.b = 40
weeks_mock.return_value.c = 50
# some more code...我也尝试过像这样使用PropertyMock,但没有成功:
@patch('calendar.Weeks')
def test_something_else(weeks_mock):
type(weeks_mock).a = PropertyMock(side_effect=[0, 10, 20, 30])
weeks_mock.return_value.b = 40
weeks_mock.return_value.c = 50
# some more code...我将非常感谢任何意见!
发布于 2020-10-02 18:54:09
如果您将其作为new_callable传递给每个属性的patch,则PropertyMock将起作用:
class Weeks():
a = property(lambda self: 0)
b = property(lambda self: 0)
c = property(lambda self: 0)
@patch('__main__.Weeks.a', new_callable=PropertyMock)
@patch('__main__.Weeks.b', new_callable=PropertyMock)
@patch('__main__.Weeks.c', new_callable=PropertyMock)
def test_something_else(mock_c, mock_b, mock_a):
mock_a.side_effect = [0, 10, 20, 30]
mock_b.return_value = 40
mock_c.return_value = 50
# some more code...
weeks = Weeks()
assert weeks.a == 0
assert weeks.a == 10
assert weeks.b == 40
assert weeks.c == 50实际上,您的PropertyMock示例适用于a。我只需要调整b和c,让它完全正常工作:
@patch('__main__.Weeks')
def test_something_else(weeks_mock):
type(weeks_mock).a = PropertyMock(side_effect=[0, 10, 20, 30])
type(weeks_mock).b = PropertyMock(return_value=40)
type(weeks_mock).c = PropertyMock(return_value=50)
# some more code...
assert weeks_mock.a == 0
assert weeks_mock.a == 10
assert weeks_mock.b == 40
assert weeks_mock.c == 50如果您需要更复杂的逻辑,可以直接打补丁到新的property
@patch('__main__.Weeks.a', property(lambda self: 40 if self.b else 50))
def test_something_complicated():
# some more code...
weeks = Weeks()
assert weeks.a == 50https://stackoverflow.com/questions/51852648
复制相似问题