Sto usando Python 2.7.9 in Windows.Come può un python 2 doctest fallire e tuttavia non avere alcuna differenza nei valori nel messaggio di errore?
Ho un file script python UTF-8-encoded con il seguente contenuto:
# coding=utf-8
def test_func():
u"""
>>> test_func()
u'☃'
"""
return u'☃'
ottengo un errore curioso quando corro il doctest:
Failed example:
test_func()
Expected:
u'\u2603'
Got:
u'\u2603'
vedo questa stessa fallimento uscita se lancio i doctest attraverso l'IDE che uso solitamente (IDEA IntelliJ), o dalla riga di comando:
> x:\my_virtualenv\Scripts\python.exe -m doctest -v hello.py
Ho copiato le righe sotto Expected
e Got
in WinMerge per escludere una sottile differenza nei caratteri che non riuscivo a individuare; mi ha detto che erano identici.
Tuttavia, se rifare la corsa riga di comando, ma reindirizzare l'output in un file di testo, in questo modo:
> x:\my_virtualenv\Scripts\python.exe -m doctest -v hello.py > out.txt
il test fallisce ancora, ma l'uscita fallimento risultante è un po 'diverso:
Failed example:
test_func()
Expected:
u'☃'
Got:
u'\u2603'
Se metto l'unicode sfuggito letterale nel mio doctest:
# coding=utf-8
def test_func():
u"""
>>> test_func()
u'☃'
"""
return u'\\u2603'
il test viene superato. Ma per quanto posso dire, u'\u2603'
e u'☃'
dovrebbero valutare la stessa cosa.
Davvero Ho due domande circa il caso non andato:
- è una delle rappresentazioni che il doctester sta dando (sotto
Expected
oGot
) non corretta per il valore che il doctester ha per questo caso? (ad esempiox != eval(repr(x))
) - In caso negativo, perché il test ha esito negativo?
Per riassumere la questione: il doctester confronta i risultati nel settore di rappresentazione. Il problema è in realtà più simile a 'x! = Repr (eval (x))' (che accade, in quanto esiste più di un modo per rappresentare la stessa stringa in Python); il doctester prende la rappresentazione dell'effettivo output della funzione, che ha '\ u' le sequenze di escape e la confronta con la rappresentazione attesa che gli ho dato che ha il carattere unicode letterale. Quando questo fallisce, stampa la rappresentazione usando un operatore di formato che converte anche i caratteri unicode letterali nella rappresentazione prevista in escape. – rakslice
Avere un test che confronta le rappresentazioni dei valori piuttosto che confrontare i valori effettivi non è l'ideale, ma è probabilmente più pratico da implementare. – rakslice