2012-03-02 13 views
5

संपादितनाम 'self' को एक unittest करते समय परिभाषित नहीं किया गया है?

तो मैं, फिर से कोशिश एक नई फ़ाइल के साथ test2.py कहा जाता है और यह काम करता था। मैंने repoman पैक किया, और test.pysrc फ़ोल्डर में है। मैंने को मेरे repoman egg को स्थापित और स्थापित करने के बाद संशोधित किया। मुझे लगता है कि यह समस्या है। लेकिन मदद के लिए धन्यवाद। क्या आप लोग सोचते हैं कि यह सही कारण है?


import unittest 
import requests 
from repoman.core import ultraman, supported 
from repoman.ext import writefile,locate_repo 

class TestWriteFile(unittest.TestCase): 

    def setUp(self): 
     self.username = 'dummy' 
     self.password = 'dummy' 
     self.remote = 'http://192.168.1.138:6666/scm/hg/NCL' 

    def test_scm_permission(self): 
     """ 
     Test SCM login. 
     """ 
     r = requests.get("http://192.168.1.138:6666/scm/", auth=(self.username, self.password)) 
     self.assertTrue(r.ok) 

if __name__ == '__main__': 
    unittest.main() 

रनिंग python test.py मैं इस त्रुटि मिलती है:

Traceback (most recent call last): 
    File "test.py", line 7, in <module> 
    class TestWriteFile(unittest.TestCase): 
    File "test.py", line 19, in TestWriteFile 
    self.assertTrue(r.ok) 
NameError: name 'self' is not defined 

मुझे नहीं लगता कि मैं __init__ समारोह अधिलेखित करने के लिए की जरूरत है, मैं कर सकता हूँ? इसका क्या कारण है? self क्यों परिभाषित नहीं किया गया है? मैंने पहले से ही अपने सुपरक्लास unittest.TestCase

धन्यवाद घोषित कर दिया है।

मैं मूल रूप से आधिकारिक नमूना से यह सीखा है: Unittest - Basic Example

+3

ऐसा विश्वास करना मुश्किल लगता है। क्या आप 100% सुनिश्चित हैं कि यह आपका सटीक कोड है? –

+0

@ डेविड हेफरन हां। यह सही कोड है। इसलिए मैंने फिर से प्रयास किया, 'test2.py' नामक एक नई फ़ाइल के साथ और यह काम करता है। मैंने 'repoman' पैक किया, और' test.py' src फ़ाइल में है। मैंने अपना 'रिपोमन' अंडा बनाया और स्थापित करने के बाद 'test.py' को संशोधित किया। मुझे लगता है कि यह समस्या है। लेकिन मदद के लिए धन्यवाद। क्या आप लोग सोचते हैं कि यह एक समस्या है? अगर यह वास्तव में समस्या है, तो मैं अपना शीर्षक संपादित करूंगा। – CppLearner

+1

नहीं, मुझे विश्वास नहीं है कि यह आपका वास्तविक कोड है। यदि 'self.assertTrue (r.ok)' विफल रहता है तो पहले लाइन भी होगी। इसलिए 'self.assertTrue (आर।ठीक है) 'निष्पादित नहीं होगा। –

उत्तर

6

मुझे नहीं लगता है कि आप क्या पता चला वास्तविक कोड है कि निष्पादित हो है।

मैं और दूसरों belive कि, कारणों की एक जोड़ी के लिए:

  • तो self.assertTrue(r.ok) तो होगा भी विफल रहता से पहले लाइन। इसलिए self.assertTrue(r.ok) निष्पादित नहीं होगा। (David Heffernan के रूप में कहा गया)
  • और क्योंकि आपका कोड ठीक दिखता है।

मैं कहना चाहता हूँ कि आप शायद इस तरह की कोई टाइपिंग त्रुटि हुई:

def test_scm_permission(self): 
         ^
         | 
     and wrote something here that's not self 

कि बजाय एक आप दिखा रहे हैं के निष्पादित हो कुछ फ़ाइल में।

इस उदाहरण पर एक नज़र डालें:

# test.py 
class MyClass: 

    def func(sel): # typo error here 
     self.name = 10 


obj = MyClass() 
obj.func() 

और चलाने के लिए जब मैं करने की कोशिश की:

$ python3 test.py 
Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    obj.func() 
    File "test.py", line 4, in func 
    self.name = 10 
NameError: global name 'self' is not defined 

ट्रैसबैक आपसे मिलते-जुलते होने।

नोट: इसके अलावा, अगर मैं गलत नहीं भरोसा कर रहा हूँ self.assertTrue(r.ok) लाइन 18 पर, लाइन 19 (जो संख्या अपने ट्रैसबैक में पता चला है) के बजाय है।

+2

मुझे लगता है कि आप कम या ज्यादा सही हैं, लेकिन यदि टाइपो वहां था, तो यह उपरोक्त पंक्ति पर असफल रहा होगा जब उसने 'self.username' ढूंढने का प्रयास किया था। –

+0

@ रिक पोगगी ठीक है। मैं कहूंगा "नहीं, यह सही कोड नहीं है" क्योंकि 'self.assertTrue (r.ok)' से पहले कोई टिप्पणी है लेकिन यह ठीक से टिप्पणी की गई थी। इसे हटाने से यह दूर नहीं जाता है। तो इसके बजाय यह नहीं है, मैं कहता हूं कि यह वही सटीक कोड है। – CppLearner

+0

@CppLearner: तो जब इस कोड का परीक्षण करते हैं, तो आपको सही त्रुटि मिलती है? क्या आप एक वास्तविक, न्यूनतम उदाहरण बना सकते हैं जो समस्या दिखाता है? –

2

यह डेविड हेफ़र्नन की टिप्पणी का एक रिकॉर्डिंग है।

आपके द्वारा पोस्ट किया गया कोड उस ट्रेसबैक का कारण नहीं हो सकता है।

अपने कोड से इन दो पंक्तियों पर विचार करें:

r = requests.get("http://192.168.1.138:6666/scm/", auth=(self.username, self.password)) 
self.assertTrue(r.ok) 

ट्रैस बैक कहते त्रुटि (NameError: name 'self' is not defined) दूसरी पंक्ति (self.assertTrue(r.ok)) पर होता है। हालांकि, यह मामला नहीं हो सकता है क्योंकि पहली पंक्ति self को संदर्भित करती है। यदि self परिभाषित नहीं किया गया था, तो हम पहली पंक्ति को नहीं प्राप्त करेंगे।

इसलिए, आपके द्वारा पोस्ट किया गया कोड वह कोड नहीं है जिसे आपने चलाया था।

7

मुझे यकीन नहीं है कि समस्या कहां से आ रही है - चाहे वह एक प्रतिलिपि त्रुटि है या गलत test.py निष्पादित किया जा रहा है [अद्यतन: या कुछ मिश्रित टैब-और-स्पेस समस्या, मैं कभी नहीं समझ सकता वे ध्वजांकित हो जाते हैं और जब वे नहीं करते हैं) - लेकिन मूल कारण लगभग निश्चित रूप से एक इंडेंटेशन त्रुटि है।

ध्यान दें कि त्रुटि संदेश

NameError: name 'self' is not defined 

और नहीं

NameError: global name 'self' is not defined 

जो @Rik पोग्गी मिला है। अगर आप/अप में self.assertTrue एक स्तर के लिए कदम वास्तव में क्या होता है:

~/coding$ cat test_good_indentation.py 
import unittest 

class TestWriteFile(unittest.TestCase): 
    def test(self): 
     """ 
     Doc goes here. 
     """ 
     self.assertTrue(1) 

if __name__ == '__main__': 
    unittest.main() 

~/coding$ python test_good_indentation.py 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.000s 

OK 

बनाम

~/coding$ cat test_bad_indentation.py 
import unittest 

class TestWriteFile(unittest.TestCase): 
    def test(self): 
     """ 
     Doc goes here. 
     """ 
    self.assertTrue(1) 

if __name__ == '__main__': 
    unittest.main() 

~/coding$ python test_bad_indentation.py 
Traceback (most recent call last): 
    File "test_bad_indentation.py", line 3, in <module> 
    class TestWriteFile(unittest.TestCase): 
    File "test_bad_indentation.py", line 8, in TestWriteFile 
    self.assertTrue(1) 
NameError: name 'self' is not defined 
+0

(+1) बहुत अच्छा अवलोकन। –

+0

अच्छा जासूस काम, महोदय। –

0

यह एक पुरानी सवाल है, लेकिन मैं अपने दो सेंट जोड़ना होगा सोचा के रूप में यह नहीं था यहां उल्लेख किया गया है। मैं दूसरों से सहमत हूं कि मूल कोड में कुछ प्रकार की वर्तनी त्रुटि है। ध्यान से इस कोड को देखो:

import unittest 
import requests 

class TestWriteFile(unittest.TestCase): 
    def setup(self): 
     self.username = 'dummy' 

    def test_scm_permission(self): 
     r = requests.get("http://192.168.1.138:6666/scm/", auth=(self.username, self.password)) 
     self.assertTrue(r.ok) 

कोड पहली नजर में ठीक दिखाई देता है (और फाहा उपकरण शिकायत नहीं होगा); हालांकि, मैंने सेटअप लिखा, सेटअप (राजधानी यू पर ध्यान दें)। इससे self_username को test_scm_permission संदर्भ में परिभाषित नहीं किया जाता है, क्योंकि पायथन ने स्वचालित रूप से मेरे गलत वर्तनी वाले नाम को कॉल नहीं किया है। यह जांचने के लिए कुछ और है कि आप इस प्रकार की त्रुटि में चल रहे हैं, लेकिन निश्चित हैं कि आपने कक्षा के सदस्यों को सही तरीके से परिभाषित किया है।

0

मुझे एक ही समस्या थी, लेकिन स्वयं के साथ नहीं। यह एक नियमित चर था, त्रुटि से पहले लाइन परिभाषित किया गया था।

यह स्पष्ट रूप से ... मिश्रण टैब और रिक्त स्थान के कारण था।

मैंने सभी टैब को 4 रिक्त स्थान से बदल दिया, और समस्या गायब हो गई।

पारंपरिक इंडेंटेशन त्रुटि के बजाय, कुछ अनिर्दिष्ट कारणों के लिए, मेरे पास यह था।

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