0

我想在我的单元测试中嘲笑self.var,因为名称服务器查找失败。我已经尝试过使用patch的一堆东西,但我无法让它工作。嘲笑self.var的最佳方式是什么?模拟python类中的属性进行单元测试

我的类定义如下:

class A: 
    def __init__(self): 
     self.var = Pyro4.Proxy(self.ns.lookup(temp_name)) 
    def method_1(self): 
    ..... 

我的单元测试是这样的:

class TestA(TestCase): 
    def setUp(self): 
     self.temp_A = classA()  
    def test_method(self): 
     self.temp_A.method_1()` 

回答

1

,你可以在这里做的两件事情,最简单的它只是修补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() 
0

我认为HANDL最简单的方法这是为了剔除班级的工作。

在测试文件

class AStub(A): 
    def __init__(self): 
    # By pass super constructor 
    self.var = None 

class TestA(TestCase): 
    def setUp(self): 
    self.helper = AStub()