Python 如何模拟不在测试范围内的方法? 如何模拟不在测试范围内的方法?

Python 如何模拟不在测试范围内的方法? 如何模拟不在测试范围内的方法?,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() # &

或:如何模拟未直接调用的方法

在这种情况下,方法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()