14

我是 python 中的模拟和单元测试的新手。如何模拟函数的局部变量?例如,如何age在测试时更改为 10 而不是 27?

# 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
4

2 回答 2

2

据我所知,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如果使用不当,可能无法按预期工作。有关进一步说明,请参阅修补位置。

于 2019-06-19T03:34:47.477 回答
0

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

无论如何,我怀疑您想传递一个具有默认值的参数:

def get_values(age=27, name="Alice")
    ...
于 2013-09-21T09:41:06.357 回答