2016-06-21 4 views
6

Ich versuche, eine Dienstprogrammklasse (in diesem Fall das Python-Logger-Dienstprogramm) in einem Komponententest zu verspotten.Wie wird Monkeypatch in einer "Setup" -Methode für Komponententests mit Pytest verwendet?

Während ich weiß, wie man es mit Monkeypatch pro Testlevel macht, hatte ich gehofft, ich könnte es einfach als Teil des Setup/global in irgendeiner Weise tun.

Hier ist, was ich hoffe, das ich tun kann (aber ich bin immer Fehler):

import logging 

... 

def setup(self, monkeypatch): 

    class fake_logger(level): 
        def __init__(self, val): 
            pass 

        def setLevel(self, level): 
            # Do something 

    def mock_logger(level): 
        return fake_logger(level) 
    monkeypatch.setattr(logging, 'getLogger', mock_logger) 

Was ist der richtige Weg, dies zu tun ist?

EDIT: Beispiel Fehler

name = 'setup' 

def call_optional(obj, name): 
    method = getattr(obj, name, None) 
    isfixture = hasattr(method, "_pytestfixturefunction") 
    if method is not None and not isfixture and py.builtin.callable(method): 
     # If there's any problems allow the exception to raise rather than 
     # silently ignoring them 
>   method() 
E   TypeError: setup() missing 1 required positional argument: 'monkeypatch' 
+0

Bitte fügen Sie die Fehler hinzu, die Sie erhalten, es hilft uns wirklich zu verstehen, was schief läuft. –

Antwort

3

monkeypatch arbeitet als normale pytest Leuchte. Wenn Sie es verwenden möchten, müssen Sie Ihre Methode als ein Gerät auch machen.

import logging 

import pytest 


@pytest.fixture 
def setup(monkeypatch): 

    class fake_logger(object): 
     def __init__(self, val): 
      pass 

     def setLevel(self, level): 
      # Do something 
      pass 

    def mock_logger(level): 
     return fake_logger(level) 
    monkeypatch.setattr(logging, 'getLogger', mock_logger) 

def test_fake_logger(setup): 
    # test steps 

und wenn Sie die Art von logging.getLogger('any level') in Test überprüfen, wird es fake_logger Sie definiert.

+0

Sie können auch '@ pytest.fixture (autouse = True)' ausführen, so dass es automatisch für alle Tests angewendet wird, ohne dass ein 'setup'-Argument benötigt wird. –

Verwandte Themen