2017-08-14 26 views
3

プロパティとセッターが実際に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' 

は(名前のように思える)とセッターがアクセスされることはありません。誰もが良いアイデアを持っていますか?ありがとう!

+0

'dummyName.name = 'test_name''はセッターフィールドをオーバーライドします。異なるメソッド/変数/ etcに異なる名前を使用 – EsotericVoid

答えて

2

あなたがテストしようとしているコードを上書きしたようなモックを使用すると、モックは、テスト対象のコードの外部にあるコール用です。

このコードの適切なテストは、文字列ではないものを渡すと例外が発生することをアサートすることです。

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

これは 'AssertionError:Exception not raised'エラーを返します – user2994871

+0

理由については、Coryの答えを参照してください。 –

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

関連する問題