2014-08-28 3 views
6

लौटा रहा है, मैं एक फ़िक्स्चर से कई परीक्षण/परीक्षण कक्षाओं में एक मूल्य वापस करने में सक्षम होना चाहता हूं, लेकिन जो मान पास हो जाता है वह एक कार्य है।पायस्टेस्ट फ़िक्स्चर हमेशा एक फ़ंक्शन

import pytest 

@pytest.fixture() 
def user_setup(): 
    user = { 
     'name': 'chad', 
     'id': 1 
    } 
    return user 

@pytest.mark.usefixtures('user_setup') 
class TestThings: 
    def test_user(self): 
     assert user_setup['name'] == 'chad' 

उत्पादन होता है:

=================================== FAILURES =================================== 
_____________________________ TestThings.test_user _____________________________ 

self = <tests.test_again.TestThings instance at 0x10aed6998> 

    def test_user(self): 
>  assert user_setup['name'] == 'chad' 
E  TypeError: 'function' object has no attribute '__getitem__' 

tests/test_again.py:14: TypeError 
=========================== 1 failed in 0.02 seconds =========================== 

लेकिन अगर मैं अपने परीक्षण को फिर से लिखने इतना है कि यह usefixtures डेकोरेटर का उपयोग नहीं करता, यह उम्मीद के रूप में काम करता है:

यहाँ मेरी कोड है

def test_user(user_setup): 
    assert user_setup['name'] == 'chad' 

कोई विचार क्यों सजावट विधि का उपयोग करने का प्रयास करते समय यह काम नहीं कर रहा है?

उत्तर

13

परिणाम subscripting जा करने के लिए आप @pytest.mark.usefixtures मार्कर का उपयोग करते हैं तो आप अभी भी एक समान नाम वाले इनपुट तर्क प्रदान करने के लिए अगर आप चाहते हैं कि स्थिरता में इंजेक्ट किया जा करने की जरूरत है आपके परीक्षण समारोह में।

py.test docs for fixtures में वर्णित है: में इनपुट तर्कों के रूप

स्थिरता समारोह के नाम पर बाद में अपने मंगलाचरण परीक्षण चलाने से पहले पैदा करने के लिए संदर्भित किया जा सकता ... टेस्ट कार्यों सीधे उपयोग कर सकते हैं स्थिरता नाम जो मामला स्थिरता उदाहरण स्थिरता समारोह से लौटाया जाएगा इंजेक्शन दिया जाएगा।

तो बस @pytest.mark.usefixtures सजावटी का उपयोग केवल फ़ंक्शन का आह्वान करेगा। इनपुट तर्क प्रदान करने से आपको उस फ़ंक्शन का परिणाम मिल जाएगा।

जब आप एक स्थिरता का आह्वान करना चाहते हैं तो आपको केवल @pytest.mark.usefixtures का उपयोग करने की आवश्यकता है लेकिन इसे अपने परीक्षण में इनपुट तर्क के रूप में नहीं रखना चाहते हैं। जैसा कि py.test docs में वर्णित है।

कारण आप एक अपवाद है कि के बारे में बात करती है user_setup एक समारोह किया जा रहा हो रही है क्योंकि आपके test_user समारोह के अंदर नाम user_setup वास्तव में समारोह आप फ़ाइल में पहले परिभाषित के लिए संदर्भित करता है। test_user समारोह के परिप्रेक्ष्य नाम user_setup समारोह तर्क जो लौटा दी जाएगी के पास भेजेगा से अब

@pytest.mark.usefixtures('user_setup') 
class TestThings: 
    def test_user(self, user_setup): 
     assert user_setup['name'] == 'chad' 

: अपने कोड क्या आप test_user कार्य करने के लिए एक तर्क से जोड़ना होगा उम्मीद के रूप में काम करने के लिए प्राप्त करने के लिए py.test द्वारा इंजेक्शन के रूप में स्थिरता का मूल्य।

लेकिन वास्तव में आपको @pytest.mark.usefixtures सजावट का उपयोग करने की आवश्यकता नहीं है।

+2

यह कैसे काम करता है इस बारे में स्पष्ट स्पष्टीकरण के लिए धन्यवाद। मैं सोच रहा था कि मैं अपने टेस्ट क्लास में मौजूद प्रत्येक परीक्षण कार्यों में तर्क जोड़ने के बिना इसे पूरा कर सकता हूं। – Cass

+0

मैं केवल इन दो प्रकारों के लिए अंतर और/या मामलों का उपयोग कर रहा था और जब इसका उपयोग करना, इस स्पष्टीकरण के लिए धन्यवाद। – Zelphir

+0

आधिकारिक दस्तावेज़ों के मुताबिक, आपको प्रत्येक परीक्षण फ़ंक्शन में 'user_setup' जोड़ने के लिए * नहीं होना चाहिए, जब उन्हें '@ pytest.mark.usefixtures' से सजाए गए वर्ग के अंतर्गत समूहित किया गया हो:" usefixtures मार्कर के कारण, प्रत्येक टेस्ट विधि के निष्पादन के लिए क्लींडर फ़िक्स्चर की आवश्यकता होगी, जैसे कि आपने उनमें से प्रत्येक को "cleandir" फ़ंक्शन तर्क निर्दिष्ट किया है। "(स्रोत: http://pytest.org/latest/fixture.html#using-fixtures -फॉर्म-क्लासेस-मॉड्यूल-या-प्रोजेक्ट्स) आखिरकार, इस तरह के समूह परीक्षणों का पूरा बिंदु उन्हें बैच के रूप में उपयोग करना है।) ... शायद यह एक सबसे पुरानी बग है? – Zearin

-1

दोनों मामलों में, वैश्विक स्कोप user_setup फ़ंक्शन को संदर्भित करता है। अंतर यह है कि, आपके nonfixture संस्करण में, आप एक ही नाम के साथ एक पैरामीटर बना रहे हैं, जो भ्रम के लिए एक क्लासिक नुस्खा है।

उस गैर-मिश्रण संस्करण में, test_user के दायरे में, आपके user_setup पहचानकर्ता का अर्थ यह है कि आप इसे पारित कर रहे हैं, वैश्विक दायरे में कार्य नहीं।

मुझे लगता है कि आप शायद मतलब user_setup बुला और तरह

assert user_setup()['name'] == 'chad' 
संबंधित मुद्दे