我是第一次写python测试。我正在尝试测试一个基本的模拟。我想在调用函数时返回一些我想要的值,而不是模拟对象。
这是代码: 在视图中:
def myfunction():
return "Actual data"
在测试中:
class TestBasic(unittest.TestCase):
@patch('trailblazer.views.myfunction')
def testMyFunction(self, val):
print(val)
val.return_value = "Test value"
print(val)
op = myfunction()
print(op)
输出:
<MagicMock name='myfunction' id='4520521120'>
<MagicMock name='myfunction' id='4520521120'>
Actual data
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
PS:我在课堂上没有我的方法,我不想改变它。
您在测试模块中具有对myfunction()
的直接引用,并且该引用永远不会修补。您只修补了trailblazer.views
模块中的引用。
如果您使用该引用而不是myfunction
,您的测试将起作用:
from trailblazer import views
class TestBasic(unittest.TestCase):
@patch('trailblazer.views.myfunction')
def testMyFunction(self, val):
print(val)
val.return_value = "Test value"
print(val)
op = views.myfunction()
print(op)
但是,更有意义的测试是测试使用 myfunction()
的代码。您可以使用模拟来关注特定代码单元的行为,其中模拟允许您精确控制与其他单元的交互。
换句话说,如果你有这样的代码:
def some_function_to_test():
# other things
result = myfunction()
# more things working on result
return final_result
然后在测试some_function_to_test()
时,修补myfunction()
是有意义的。
我建议您阅读有关 Python 名称如何工作的信息;我强烈推荐有关 Python 名称和值的事实和神话,以及unittest.mock
文档中的补丁位置。