2013-10-27 4 views
22

py.test विफल होने लगता है जब मैं परीक्षण कार्यों को सजाने के लिए एक तर्क के रूप में एक स्थिरता है।मैं सजाए गए कार्यों के साथ सबसे पुराने फिक्स्चर कैसे काम करूं?

def deco(func): 

    @functools.wraps(func) 
    def wrapper(*args, **kwargs): 
     return func(*args, **kwargs) 

    return wrapper 


@pytest.fixture 
def x(): 
    return 0 

@deco 
def test_something(x): 
    assert x == 0 

इस सरल उदाहरण में, मैं करने के निम्न त्रुटि:

TypeError: test_something() takes exactly 1 argument (0 given). 

वहाँ अधिमानतः बहुत ज्यादा डेकोरेटर को संशोधित किए बिना इसे ठीक करने के लिए, एक तरीका है? (चूंकि सजावटी को परीक्षण कोड के बाहर भी प्रयोग किया जाता है।)

+1

दिलचस्प है ... बस के साथ मेरे लिए ठीक काम करने के लिए लगता है पायथन 3.6 में 'functools.wraps'। 2.7 – Anentropic

उत्तर

20

ऐसा लगता है कि functools.wraps अच्छी तरह से काम नहीं करता है, इसलिए यह py.test के आत्मनिरीक्षण को तोड़ देता है।

decorator पैकेज का उपयोग कर सजावट बनाना चाल चल रहा है।

import decorator 

def deco(func): 
    def wrapper(func, *args, **kwargs): 
     return func(*args, **kwargs) 
    return decorator.decorator(wrapper, func) 
+0

में विफलता यह जानना उपयोगी हो सकता है कि पायटे सजावट पर निर्भर करता है, इसलिए आपको किसी भी नई निर्भरता को खींचने की आवश्यकता नहीं है। – zneak

4

स्थिरता सुविधा परीक्षण फ़ंक्शन हस्ताक्षर पर निर्भर करती है।

यदि आप अनुसरण के रूप में रैपर हस्ताक्षर बदल सकते हैं, तो यह काम करेगा।

def deco(func): 
    @functools.wraps(func) 
    def wrapper(x): 
     return func(x) 
    return wrapper 

आप इसे बदल नहीं सकते हैं, एक और डेकोरेटर बनाने:

def deco(func): 
    @functools.wraps(func) 
    def wrapper(*args, **kwargs): 
     return func(*args, **kwargs) 
    return wrapper 

def deco_x(func): 
    @functools.wraps(func) 
    def wrapper(x): 
     return func(x) 
    return wrapper 

और सजाने test_somthingdeco_x साथ:

@deco_x 
@deco 
def test_something(x): 
    assert x == 0 
संबंधित मुद्दे

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