1

我在一個類中使用了一種類型的修補程序,因此我使用類修飾程序修補了一些類中的測試方法。對於另一種方法,我想以不同的方式修補相同的對象。我嘗試了以下方法,但作爲類裝飾器生成的修補程序仍然有效,儘管方法本身正在用不同的修補程序進行修飾。我預計方法補丁會覆蓋類補丁。爲什麼不是這種情況?使用方法修補程序覆蓋類修補程序(修飾符)

在這種特殊情況下,我可以刪除班級補丁和補丁個別方法,但這是重複的。我怎樣才能實現這樣的重寫(方法覆蓋類補丁)機制?

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

這隻能在類decorator寫入帳戶使用方法裝飾器時纔有效。雖然類裝飾器首先出現,但它只能在創建類對象後運行,這發生在所有方法已被定義(和裝飾)之後。

類修飾器運行方法修飾器,而不是之前。

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', ...): 
     ...