你可以在这里做两件事,最简单的只是修补 Pyro4.Proxy,如下所示:
from unittest.mock import patch
# or from mock import create_autospec if you are in py2
class TestA(TestCase):
@patch('Pyro4.Proxy', autospec=True)
def test_method(self):
temp_A = A()
temp_A.method_1()
诀窍是修补“正确的对象”并且不实例化类,直到你修补之后(在你的测试函数中),Pyro4.Proxy
这是我可以从你的代码中推断出的最好的对象,但如果你class A
在 my_module 中,也许是最好的对象补丁是my_module.Pyro4.Proxy
.
您可能想要的另一件事就是模拟 var 变量。然后当您在方法self.var
内部定义__init__
并假设您不想模拟整个__init__
方法时,您可以
from unittest.mock import create_autospec
# or from mock import create_autospec if you are in py2
class TestA(TestCase):
def setUp(self):
self.temp_A = classA()
self.temp_A.var = create_autospec(Pyro4.Proxy)(None)
def test_method(self):
self.temp_A.method_1()
如果您可以稍微重构您的类,我建议将 var 设置为易于模拟的属性
class A(object):
def __init__(self):
...
@property
def var(self):
return Pyro4.Proxy(self.ns.lookup(temp_name))
def method_1(self):
.....
然后你的测试课可以是
from unittest.mock import create_autospec, PropertyMock
class TestA(TestCase):
def setUp(self):
self.temp_A = classA()
type(self.temp_A).var = PropertyMock(side_effect=lambda *x, **y: create_autospec(Pyro4.Proxy)(*x, **y))
def test_method(self):
self.temp_A.method_1()