蟒蛇模拟库 - 打补丁,而类的单元测试(python mock library - patching

2019-09-22 05:35发布

我不能补丁怎么模拟的作品了解,如果确实它能够解决我的问题。

我有3个文件:与外部接口(a.py),业务逻辑(b.py)和测试(test.py)通信。 我想修补,同时运行测试所使用的业务逻辑外部接口。

a.py:

class SomeProductionClassINeedPatch(object):
    name = 'Production Class (communication with some external service)'
    def do_something(self):
        print '<some feature with external service>'

b.py:

import mock
from src.tmp.mocks.a import SomeProductionClassINeedPatch

class WorkingClass(object):
    def some_method_that_uses_external_class(self, *args):
        external = self._external
        external.do_something()

    @property
    def _external(self):
        if not hasattr(self, '_ext_obj' or not self._ext_obj):
            self._ext_obj = SomeProductionClassINeedPatch()
            print isinstance(self._ext_obj, mock.MagicMock) # False
        return self._ext_obj

b = WorkingClass()
b.some_method_that_uses_external_class()

test.py:

import mock
from src.tmp.mocks.b import WorkingClass    # class I want to test

@mock.patch('src.tmp.mocks.a.SomeProductionClassINeedPatch')
def test_some_method_of_working_class(external_mock=None, *args):
    o = WorkingClass()
    o.some_method_that_uses_external_class()        # external interface wasn't patched: <some feature with external service> - but I need mock here!
    print '<test> - '+str(isinstance(o._external, mock.MagicMock))  # False

test_some_method_of_working_class()

我想到的是打电话o.some_method_that_uses_external_class()在test.py实际上不会使用外部接口,但模仿的对象。 但似乎仍然被用于实际的对象。

此外,当我检查无论是在test.py或b.py外部接口对象的实例-我不能让他们通过isinstance(对象,MagicMock)检查,它总是返回false。 即使我尝试应用在b.py相同的修补程序(如类装饰)。 我究竟做错了什么?

我由迈克尔Foord使用Python 2.7和模型库1.0,如果该事项。

Answer 1:

如规定凡补丁 :

补丁作品(暂时)改变对象的名称指向与另一之一。 可以有很多名字指向任何单独的对象,所以修补工作,你必须确保补丁测试系统所使用的名称。

在您的例子,使用您想修补的对象的代码模块b 。 当你调用补丁,该类已导入模块b ,所以修补a会没有影响b 。 您需要而不是路径对象b

@mock.patch('src.tmp.mocks.b.SomeProductionClassINeedPatch')

这会给你预期的结果,从第一次调用b是打补丁,而从第二个呼叫test使用的模拟对象:

# python test.py
False
<some feature with external service>
True
<test> - True


文章来源: python mock library - patching classes while unit testing