Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中模拟函数的局部变量_Python_Unit Testing - Fatal编程技术网

在python中模拟函数的局部变量

在python中模拟函数的局部变量,python,unit-testing,Python,Unit Testing,我不熟悉python中的模拟和单元测试。如何模拟函数的局部变量?例如,如何在测试时将年龄从27岁改为10岁 # data_source.py def get_name(): age = 27 #real value return "Alice" # person.py from data_source import get_name class Person(object): def name(self): return get_n

我不熟悉python中的模拟和单元测试。如何模拟函数的局部变量?例如,如何在测试时将年龄从27岁改为10岁

# data_source.py
def get_name():
    age = 27 #real value
    return "Alice"

# person.py
from data_source import get_name

class Person(object):
    def name(self):
        return get_name()

# The unit test 
from mock import patch
from person import Person
   
@patch('person.age')
def test_name(mock_age):
    mock_age = 10 # mock value
    person = Person()
    name = person.name()
    assert age == 10

我无法想象你为什么要这么做。测试用于检查实际函数的编写方式,而不是改变它们的工作方式,以便它们与任意测试匹配

在任何情况下,我怀疑您想要传递一个带有默认值的参数:

def get_values(age=27, name="Alice")
    ...

据我所知,
mock
无法模拟局部变量。它只能模拟非本地对象

试图模拟局部变量听起来很可疑。也许你应该试试另一种方法。尝试将
age
设置为全局变量或类变量。然后可以使用
mock
模拟全局变量或类变量

例如:

# source file
G_AGE = 27

def get_name():
    return "Alice"

# unit test file
...
@patch('XXX.G_AGE')
def test_name(mock_age):
    mock_age = 10
    ....

只需注意
patch
用法:
mock
如果使用不当,可能无法正常工作。请参阅以获得进一步解释。

您这么说,但这正是编写mock的原因:更改函数的工作方式,以便更容易/更快地进行测试。例如,我继承了许多已发布的API代码,这些代码与一些非常慢的IO进行交互。我希望能够重写超时变量(被测函数中的本地变量和常量),这样我就可以测试异常行为,而不必等待现实世界(5-7分钟)的超时情况。您可能需要模拟从远程进程或API调用返回的变量的成功/失败。@anregen“改变你的职能运作方式“通过修改其环境,而不是修改其自身的实现。您希望超时值可以从外部修改这一事实突出表明,它是一个应该被注入的依赖项。如果您应该测试有问题的代码,那么应该允许您修复它。如果不是,那么您正在测试使用IO的客户端代码,您应该模拟整个事件,而不仅仅是它的超时值。即使在代码组织之外,您也不希望您的测试依赖于IO成功@nmcilree您可以通过模拟进程/调用本身来实现这一点,这样模拟将根据需要返回success/fail。如果测试函数需要从外部更改
age
值,则设置该值不应是函数工作的一部分,这可能会有所帮助。在这里,测试系统会自动警告您一个主要的代码设计问题,只需简单地通过现有代码。