【问题标题】:Mocking an object and patching associated functions模拟对象并修补相关功能
【发布时间】:2021-12-10 02:36:00
【问题描述】:

我有一个简单的应用程序,它创建一个小部件,并在其中创建一个 Env 对象。初始化 Env 对象需要大量外部调用,这对于我正在测试的函数来说是不必要的,所以我只想模拟整个对象(或 init)。但是,我想修补 get_parents 函数以返回特定数据进行测试。我不知道如何修补这个。这是我的课程:

env.py:

class Env(object):
    def __init__(self):
        # Lots of external calls that are not needed for
        # this specific test
        pass

    def get_parents(self):
        return ['moms']

widget.py

from env import Env

class Widget(object):
    def __init__(self):
        self.env = Env()

    def display_parents(self):
        return ','.join(self.env.get_parents())

我正在尝试设置测试来修补初始对象创建和我正在尝试修补的函数的返回值。这会模拟对象,但不会返回正确的值:

测试/test_widget.py

@patch('widget.Env.get_parents', return_value=['moms,pops'])
@patch('widget.Env')
def test_widget(mock_env, mock_get_parents):
    widget = Widget()
    assert widget.display_parents() == 'moms,pops' # Fails

我尝试以这种方式进行修补和模拟,但 get_parents 函数甚至没有被调用:

from widget import Widget
from unittest.mock import patch

@patch('widget.Env.get_parents', return_value=['moms,pops'])
@patch('widget.Env')
def test_widget(mock_env, mock_get_parents):
    widget = Widget()
    widget.display_parents()
    assert mock_get_parents.called

【问题讨论】:

    标签: python pytest python-unittest


    【解决方案1】:

    您的Env 补丁正在覆盖您的mock_get_parents。只需修补Env 并酌情修改其属性即可;这正是Mock 对象如此灵活的原因!

    @patch('widget.Env')
    def test_widget(mock_env_class):
        mock_env_class.return_value.get_parents.return_value=['moms,pops']
        widget = Widget()
        widget.display_parents()
        assert mock_env_class.return_value.get_parents.call_count == 1
    

    【讨论】:

    • 我复制并粘贴了整个代码,但仍然无法正常工作。它声称call_count 仍然是0。
    • 哦,呵呵。更新了我的答案。诀窍在于补丁对象是,而不是实例——所以它的return_value 将被设置为widget.env
    • 这太棒了!我不认为我会自己找到这个。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    相关资源
    最近更新 更多