2017-08-14 99 views
3

我想弄清楚是否有辦法(單元測試)驗證該屬性和setter實際上被調用來設置name屬性。Python單元測試類屬性

class DummyName: 
    def __init__(self): 
     self.name = '' 

    @property 
    def name(self): 
     return self.name 

    @name.setter 
    def name(self, name): 
     if not isinstance(name, basestring): 
      raise Exception('Name must be a string.') 
     self.name = name 

試圖做這樣的事情......

@mock.patch.object(DummyName, 'name', new_callable=PropertyMock) 
def testNameProperty(self, mock_name): 
    MockName = Mock() 
    mock_name.return_value = MockName 
    dummyName = DummyName() 
    dummyName.name = 'test_name' 
    # assert setter is called to set the name 
    # assert name is called to get the name 
    # assert name is 'test_name' 

好像名稱()和setter從不訪問。任何人有更好的主意?謝謝!

+0

'dummyName.name ='test_name''覆蓋了setter字段。使用不同的名稱爲不同的方法/變量/等 – EsotericVoid

回答

2

通過使用這樣的模擬你已經覆蓋了你要測試的代碼。 Mock適用於被測代碼外部的調用。

此代碼的適當測試是斷言如果您傳遞的不是字符串,則會引發異常。

def testNameProperty(self): 
    dummyName = DummyName() 
    with self.assertRaises(Exception): 
     dummyName.name = 12345 
+0

這給'AssertionError:異常沒有引發'錯誤 – user2994871

+0

請參閱科裏的答案爲什麼。 –

2

您的課程需要繼承object

class DummyName(object): 
    def __init__(self): 
     self._name = '' 

    @property 
    def name(self): 
     return self._name 

    @name.setter 
    def name(self, name): 
     if not isinstance(name, basestring): 
      raise Exception('Name must be a string.') 
     self._name = name 

你還需要使用不同的變量爲name類裏面,或者你會擊中最大遞歸。

+0

謝謝!這工作! – user2994871