首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对类属性使用side_effect不起作用

对类属性使用side_effect不起作用
EN

Stack Overflow用户
提问于 2018-08-15 11:42:04
回答 2查看 1.4K关注 0票数 2

我在弄清楚如何使用MagicMockside_effect属性时遇到了问题,但它似乎只有在我为函数打补丁时才有效。然而,我想修补属性。下面是一个最小的代码示例:

代码语言:javascript
运行
复制
# 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,但没有成功:

代码语言:javascript
运行
复制
@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...

我将非常感谢任何意见!

EN

Stack Overflow用户

发布于 2020-10-02 18:54:09

如果您将其作为new_callable传递给每个属性的patch,则PropertyMock将起作用:

代码语言:javascript
运行
复制
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。我只需要调整bc,让它完全正常工作:

代码语言:javascript
运行
复制
@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

代码语言:javascript
运行
复制
@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 == 50
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51852648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档