1

オブジェクトに1種類のパッチを適用するクラスにいくつかのテストメソッドがあるので、クラスデコレータでパッチを当てました。私は別の方法を1つの別の同じオブジェクトを修正したい。次のアプローチを試しましたが、メソッド自体に別のパッチを付けても、クラスデコレータとして作成されたパッチは有効です。メソッドパッチがクラスパッチをオーバーライドすることを期待しました。なぜこれは当てはまりませんか?メソッドpatch(デコレータ)でクラスパッチをオーバーライドします

このケースでは、クラスパッチとパッチの個別メソッドを削除できますが、それは繰り返します。このようなオーバーライド(メソッドオーバーライドクラスパッチ)メカニズムを実装するにはどうすればよいですか?

from unittest TestCase 
from unittest import mock 

@mock.patch('my_module.cls.method', mock.Mock(side_effect=RuntimeError('testing')) 
class SwitchViewTest(TestCase): 

    def test_use_class_patching(self): 
     # several other methods like this 
     # test code .. 

    @mock.patch('my_module.cls.method', mock.Mock(side_effect=RuntimeError('custom')) 
    def test_override_class_patching(self): 
     # test code ... 

答えて

1

これは、クラスデコレータがメソッドデコレータの使用を考慮して記述されている場合にのみ機能します。クラスデコレータは最初に表示されますが、クラスオブジェクトが作成された後にのみ実行できます。これは、すべてのメソッドが定義(および装飾)された後に行われます。

のメソッドデコレータの後にクラスデコレータが実行されます。

0

私はまったく別のアプローチを採用します。

class SwitchViewTest(TestCase): 

    class SwitchViewStub(SwitchView): 
    """ Stub out class under test """ 
    def __init__(self): 
    """ Bypass Constructor """ 
     self.args = None 
     ... # Fill in the rest 

    def setUp(): 
    self.helper = self.SwitchViewStub() 
    self.helper.method_to_mock = MagicMock(...) 
    ... 

    def test_override_class_patching(self): 
    with mock.patch.object(self.helper, 'method_to_mock', ...): 
     ... 
関連する問題