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()