1

Ich habe mehrere Testmethoden in einer Klasse, die eine Art des Patchens für ein Objekt verwenden, also habe ich mit Class Decorator gepatcht. Für eine einzelne andere Methode möchte ich das gleiche Objekt unterschiedlich patchen. Ich habe den folgenden Ansatz versucht, aber der Patch, der als Klassen-Dekorator erstellt wurde, ist in Kraft, obwohl die Methode selbst mit einem anderen Patch versehen ist. Ich habe erwartet, dass der Methoden-Patch den Klassen-Patch außer Kraft setzt. Warum ist das nicht der Fall?Überschreiben Sie den Klassen-Patch mit Methoden-Patch (Dekorator)

In diesem speziellen Fall kann ich Klassen-Patch entfernen und einzelne Methoden patchen, aber das würde sich wiederholen. Wie kann ich einen solchen Override-Mechanismus (method overrides class patch) implementieren?

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 ... 

Antwort

1

Dies kann nur funktionieren, wenn der Klassendekorator für die Verwendung von Methodendekoratoren geschrieben wird. Obwohl der Klassendekorator zuerst angezeigt wird, kann er erst ausgeführt werden, nachdem das Klassenobjekt erstellt wurde. Dies geschieht, nachdem alle Methoden definiert (und dekoriert) wurden.

Klasse Dekoratoren führen nach Methode Dekorateure, nicht vorher.

0

Ich würde einen ganz anderen Ansatz nehmen.

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