Python 如何模拟不在测试范围内的方法? 如何模拟不在测试范围内的方法?
或:如何模拟未直接调用的方法 在这种情况下,方法bazPython 如何模拟不在测试范围内的方法? 如何模拟不在测试范围内的方法?,python,python-2.7,mocking,Python,Python 2.7,Mocking,或:如何模拟未直接调用的方法 在这种情况下,方法baz 我用的是pypi的 ### tests # ... def test_method_a(self): # how to mock method that is called from bar() ? obj = foo.bar() self.assertEqual(obj.get('x'), 12345) ### foo # ... def bar(): x = some_module.baz() # &
我用的是pypi的
### tests
# ...
def test_method_a(self):
# how to mock method that is called from bar() ?
obj = foo.bar()
self.assertEqual(obj.get('x'), 12345)
### foo
# ...
def bar():
x = some_module.baz() # <- how to mock baz() ?
return x
测试
# ...
def测试方法a(自身):
#如何模拟从bar()调用的方法?
obj=foo.bar()
self.assertEqual(对象get('x'),12345)
###福
# ...
def bar():
x=some_module.baz()#下面是一个示例,应该向您展示它是如何工作的:
from mock import patch
def baz():
return 'y'
def bar():
x = baz() # <- how to mock baz() ?
return x
def test():
with patch('__main__.baz') as baz_mock:
baz_mock.return_value = 'blah'
assert bar() == 'blah'
test()
来自模拟导入修补程序的
def baz():
返回“y”
def bar():
x=baz()#IMHO此示例更好地说明了单元测试期间的常见用例
重要的部分是@patch
装饰器,它有效地将副作用
函数(这也可能只是一个值)替换为被修补的函数。棘手的一点通常是获得补丁函数的完整包路径。请注意必须如何使用“\uuuu main\uuuu.func”
来引用已修补的函数
第一个测试,test\u func
检查测试的模拟值是否为原始预期函数值('Hello World!'
)。第二个测试,test\u mock\u func
将func
修补为实际为函数对象new\u func
,因此返回True
。第三个测试说明了作为副作用的替换值而不是新函数。事实上,由于我们将替换值设置为一个iterable(side_effect=['New String 1!','New String 2!',3]
),因此每次运行时,它都会返回一个新值
警告:如果尝试调用修补函数的次数超过指定的返回值(本例中为3次),则会出现StopIteration
错误,因为您没有在副作用中定义足够的返回值
嗯。。你能解释一下吗?要么我不明白你的例子,要么它不起作用哎呀,我确实有一个小错误。我确认这在我的机器上有效。希望这有帮助。酷,这一个有效!你能解释一下如何用一个补丁模拟许多方法吗?(没有嵌套的带有
语句的修补('module')作为mock:mock.baz.return_value#…
不起作用:/@Lucas,如果需要修补的所有方法都在单个对象上,则可以使用。
import unittest
from mock import patch # for Python 2.7
# from unittest.mock import patch # for Python 3.5
def func():
return 'Hello World!'
def newFunc():
return True
class TestFunc(unittest.TestCase):
def test_func(self):
self.assertEqual(func(), 'Hello World!')
@patch('__main__.func', side_effect=newFunc)
def test_mocked_func(self, *patches):
self.assertTrue(func())
@patch('__main__.func', side_effect=['New String 1!', 'New String 2!', 3])
def test_mocked_func_again(self, *patches):
self.assertEqual(func(), 'New String 1!')
self.assertEqual(func(), 'New String 2!')
self.assertEqual(func(), 3)
# func() # This breaks the test because we only specified a list of length 3 in our patch.
if __name__=='__main__':
unittest.main()