2012-03-02 17 views
5

Modificanome 'self' non è definito quando si effettua un unittest?

Così ho provato di nuovo, con un nuovo file chiamato test2.py e funziona. Ho impacchettato repoman e test.py nella cartella src. Ho modificato test.py dopo aver creato e installato il mio repoman egg. Penso che sia il problema. Ma grazie per l'aiuto. Ragazzi, pensate che sia la ragione esatta?


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() 

Esecuzione python test.py ottengo questo errore:

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 

Non penso che ho bisogno di sovrascrivere __init__ funzione, posso? Cosa sta causando questo? Perché self non è definito? Ho già dichiarato la mia superclasse unittest.TestCase

Grazie.

ho praticamente imparato dal campione ufficiale: Unittest - Basic Example

+3

Sembra difficile da credere. Sei sicuro al 100% che questo è il tuo codice esatto? –

+0

@DavidHeffernan Sì. È il codice esatto Così ho provato ancora, con un nuovo file chiamato 'test2.py' e funziona. Ho impacchettato 'repoman' e' test.py' si trova nel file src. Ho modificato 'test.py' dopo che ho creato e installato il mio uovo' repoman'. Penso che sia il problema. Ma grazie per l'aiuto. Ragazzi, pensate che sia un problema? Se questo è effettivamente il problema, modificherei il mio titolo. – CppLearner

+1

No, non credo che sia il tuo vero codice. Se 'self.assertTrue (r.ok)' fallisce, anche la riga precedente lo sarà. Pertanto 'self.assertTrue (r.ok) 'non verrà eseguito. –

risposta

6

Non credo che quello che hai mostrato è il codice effettivo che vengono eseguiti.

io ed altri belive che, per un paio di motivi:

  • Se self.assertTrue(r.ok) fallisce poi la linea prima che si troppo. Pertanto, self.assertTrue(r.ok) non verrà eseguito. (come David Heffernan ha detto)
  • E perché il codice sembra buono.

direi che probabilmente hai fatto un errore di battitura di questo genere:

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

In qualche file che vengono eseguiti al posto di quello che si sta mostrando.

Date un'occhiata a questo esempio:

# test.py 
class MyClass: 

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


obj = MyClass() 
obj.func() 

E quando ho cercato di correre:

$ 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 

Avere un traceback simile al tuo.

Nota: Anche se non sto contando errato self.assertTrue(r.ok) è sulla riga 18, invece della riga 19 (che è il numero mostrato nel traceback).

+2

Penso che tu abbia più o meno ragione, ma se l'errore di battitura era lì, sarebbe fallito sulla riga sopra quando ha cercato di trovare 'self.username'. –

+0

@Rik Poggi Va bene. Dirò "no, non è il codice esatto" perché c'è un commento prima di "self.assertTrue (r.ok)" Ma è stato commentato correttamente. Rimozione non lo fa andare via. Quindi invece di dirlo non lo è, dico che è lo stesso codice esatto. – CppLearner

+0

@CppLearner: Quindi, quando si prova questo stesso codice, si ottiene un errore giusto? Puoi creare un esempio reale e minimale che mostri il problema? –

2

Questa è una riformulazione del commento di David Heffernan.

Il codice inviato non può essere la causa di tale traceback.

Considerare questi due righe dal codice:

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

Il traceback dice l'errore (NameError: name 'self' is not defined) avviene sulla seconda linea (self.assertTrue(r.ok)). Tuttavia, questo non può essere stato il caso perché la prima riga si riferisce a self. Se self non fosse stato definito, non avremmo superato la prima riga.

Pertanto, il codice che hai postato non è il codice che hai eseguito.

7

Non sono sicuro da dove provenga il problema: che si tratti di un errore di copia o di un errore test.py in esecuzione [aggiornamento: o di un problema misto di tabulazioni e spazi, non riesco mai a capire quando quelli vengono contrassegnati e quando non lo fanno] - ma la causa principale è quasi certamente un errore di indentazione.

Si noti che il messaggio di errore è

NameError: name 'self' is not defined 

e non

NameError: global name 'self' is not defined 

che @Rik Poggi ottenuto. Questo è esattamente ciò che accade se si sposta il livello self.assertTrue uno in/su:

~/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 

contro

~/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) Ottima osservazione. –

+0

Bel lavoro investigativo, signore. –

0

Questa è una vecchia questione, ma ho pensato di aggiungere i miei due centesimi in quanto non era menzionato qui. Sono d'accordo con gli altri sul fatto che ci sia un qualche tipo di errore di ortografia nel codice originale. Guarda attentamente questo codice:

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) 

Il codice appare a prima vista (e gli strumenti di lanuggine non si lamenteranno); tuttavia, ho scritto setup, anziché setUp (notare la capitale U). Questo fa sì che self.username non venga definito nel contesto test_scm_permission, perché python non ha chiamato automaticamente il mio nome funzione mispelled. Questo è un altro aspetto da verificare se stai riscontrando questo tipo di errore, ma sei sicuro di aver definito correttamente i membri della classe.

0

Ho avuto lo stesso problema, ma non con me stesso. Era una variabile regolare, ha definito la linea prima che si verificasse l'errore.

Apparentemente era dovuto a ... mixin tabs e spazi.

Ho sostituito tutte le schede di 4 spazi e il problema è scomparso.

Per qualche motivo non specificato, invece del tradizionale errore di indentazione, ho avuto questo.

Problemi correlati