我第一次写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:我不会在课堂上使用我的方法而且我不想改变它。
答案 0 :(得分:1)
您可以直接引用测试模块中的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名称的工作原理;我强烈推荐Facts and myths about Python names and values以及unittest.mock
文档中的Where to patch。