2016-06-21 11 views
6

मैं एक यूनिट परीक्षण में उपयोगिता वर्ग (इस मामले में पायथन लॉगर उपयोगिता) का नकल करने का प्रयास कर रहा हूं।पाइस्टेस्ट का उपयोग करके यूनिट परीक्षणों के लिए "सेटअप" विधि में बंदरपैच का उपयोग कैसे करें?

जबकि मुझे पता है कि प्रति परीक्षण स्तर पर बंदरपैच का उपयोग करके इसे कैसे किया जाए, मुझे उम्मीद थी कि मैं इसे किसी भी तरह से सेटअप/वैश्विक स्तर के हिस्से के रूप में कर सकता हूं।

यहाँ मैं उम्मीद कर रहा हूँ कि क्या मैं ऐसा कर सकते हैं (लेकिन मैं त्रुटियों हो रही है) है:

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) 

यह करने के लिए सही तरीका क्या है?

संपादित करें: उदाहरण त्रुटि एक सामान्य pytest स्थिरता के रूप में

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

कृपया जो त्रुटियां मिल रही हैं, उसे शामिल करें, यह वास्तव में हमें समझने में मदद करता है कि क्या गलत हो रहा है। –

उत्तर

3

monkeypatch काम करता है। यदि आप इसका उपयोग करना चाहते हैं, तो आपको अपनी विधि को एक स्थिरता के रूप में भी बनाना होगा।

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 

और यदि आप परीक्षा में logging.getLogger('any level') के प्रकार की जाँच करें, यह हो जाएगा fake_logger आप को परिभाषित किया।

+0

आप '@ pytest.fixture (autouse = True) भी कर सकते हैं, इसलिए यह स्वचालित रूप से 'सेटअप' तर्क के बिना सभी परीक्षणों के लिए लागू होता है। –

संबंधित मुद्दे