2016-06-21 15 views
6

Bir birim sınamasında bir yardımcı program sınıfı (Bu durumda python günlüğü yardımcı programı) dağıtmaya çalışıyorum.Pytest kullanarak birim testleri için monkeypatch bir "kurulum" yönteminde nasıl kullanılır?

Her test düzeyinde monkeypatch kullanarak nasıl yapılacağını bildiğim halde, bunu bir şekilde kurulumun bir parçası olarak yapabilmeyi umuyordum. İşte

ben yapabilirim umuyorum (ama hatalar alıyorum) ne:

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) 

Bunu yapmanın doğru yolu nedir?

DÜZENLEME: Örnek hata normal pytest fikstür gibi

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

Lütfen aldığınız hataları dahil edin, gerçekten neyin yanlış gittiğini anlamamıza yardımcı olur. –

cevap

3

monkeypatch çalışır. Kullanmak isterseniz, yönteminizi bir fikstür olarak da yapmanız gerekir.

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 

ve test logging.getLogger('any level') türünü kontrol ederseniz, o olacak fake_logger tanımladığınız.

+0

Ayrıca 'pytest.fixture (autouse = True)' özelliğini de kullanabilirsiniz, böylece 'setup' argümanına sahip olmaksızın tüm testler için otomatik olarak uygulanır. –

İlgili konular