Python 魔法模拟没有设置模拟值
Python magic mock not setting the mocked value
我是第一次写 python 测试。我正在尝试测试一个基本的模拟。我想 return 一些我在调用函数时想要的值,而不是模拟对象。
代码如下:
在观看次数中:
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:class 中没有我的方法,我不想更改它。
您在测试模块中有对 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()
的代码。您使用 mocking 可以专注于特定代码单元的行为,mocking 可以让您精确控制与 other 单元的交互。
换句话说,如果您有如下代码:
def some_function_to_test():
# other things
result = myfunction()
# more things working on result
return final_result
然后 在测试 some_function_to_test()
时修补 myfunction()
.
是有意义的
我建议您阅读 Python 名称的工作原理;我强烈推荐 unittest.mock
文档中的 Facts and myths about Python names and values, together with Where to patch。
我是第一次写 python 测试。我正在尝试测试一个基本的模拟。我想 return 一些我在调用函数时想要的值,而不是模拟对象。
代码如下: 在观看次数中:
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:class 中没有我的方法,我不想更改它。
您在测试模块中有对 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()
的代码。您使用 mocking 可以专注于特定代码单元的行为,mocking 可以让您精确控制与 other 单元的交互。
换句话说,如果您有如下代码:
def some_function_to_test():
# other things
result = myfunction()
# more things working on result
return final_result
然后 在测试 some_function_to_test()
时修补 myfunction()
.
我建议您阅读 Python 名称的工作原理;我强烈推荐 unittest.mock
文档中的 Facts and myths about Python names and values, together with Where to patch。