2016-05-13 6 views
2

Ich bin neu bei web.py. Ich folgte ex52 LPTHW, und ich musste bei allen Tests im Testordner Nosetests durchführen. Aber ich bekomme 1 fehlgeschlagenen Test wegen Assertion Fehler. Ich habe versucht, verschiedene Behauptungsfehler zu lesen und warum sie auftreten, aber ich kann diesen nicht herausfinden. Ich versuchte, die Fehler zu erweitern, die der Server möglicherweise als 500 Internal 400 anzeigen könnte, aber es immer noch den Test nicht besteht. Ich habe den anderen Code erstellt gerade im Buch erwähnt wie: http://learnpythonthehardway.org/book/ex52.htmlPython-Assertionsfehler bei der Durchführung von Nasetests

Hier ist mein Zurückverfolgungs:

C:\lpthw\gothonweb>cd tests 

C:\lpthw\gothonweb\tests>nosetests 
Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\web\application.py", line 239, in process 
    return self.handle() 
    File "C:\Python27\lib\site-packages\web\application.py", line 230, in handle 
    return self._delegate(fn, self.fvars, args) 
    File "C:\Python27\lib\site-packages\web\application.py", line 420, in _delegate 
    return handle_class(cls) 
    File "C:\Python27\lib\site-packages\web\application.py", line 396, in handle_class 
    return tocall(*args) 
    File "C:\lpthw\gothonweb\bin\app.py", line 29, in GET 
    return render.hello_form() 
    File "C:\Python27\lib\site-packages\web\template.py", line 1017, in __getattr__ 
    t = self._template(name) 
    File "C:\Python27\lib\site-packages\web\template.py", line 1014, in _template 
    return self._load_template(name) 
    File "C:\Python27\lib\site-packages\web\template.py", line 1001, in _load_template 
    raise AttributeError, "No template named " + name 
AttributeError: No template named hello_form 

F... 
====================================================================== 
FAIL: tests.app_tests.test_index 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\nose\case.py", line 197, in runTest 
    self.test(*self.arg) 
    File "C:\lpthw\gothonweb\tests\app_tests.py", line 12, in test_index 
    assert_response(resp) 
    File "C:\lpthw\gothonweb\tests\tools.py", line 5, in assert_response 
    assert status in resp.status, "Expected response %r not in %r" % (status , resp.status) 
AssertionError: Expected response '200' not in '500 Internal Server Error' 

---------------------------------------------------------------------- 
Ran 4 tests in 0.562s 

FAILED (failures=1) 

Meine Tests Code: app_tests.py

from nose.tools import * 
from bin.app import app 
from tests.tools import assert_response 

def test_index(): 
    #check that we get a 404 on the/URL 
    resp = app.request("/") 
    assert_response(resp, status= "404") 

    #test our first GET request to /hello 
    resp = app.request("/hello") 
    assert_response(resp) 

    #make sure default values work for the form 
    resp = app.request("/hello" , method="POST") 
    assert_response(resp , contains="Nobody") 

    #test that we get expected values 
    data = {'name':'Tejas','greet':'Ola!'} 
    resp = app.request("/hello " , method= "POST", data=data) 
    assert_response(resp , contains="Zed") 

tools.py:

from nose.tools import * 
import re 

def assert_response(resp, contains=None, matches=None, headers=None, status= "200"): 
    assert status in resp.status, "Expected response %r not in %r" % (status , resp.status) 

    if status == "200": 
     assert resp.data , "Response data is empty." 

    if contains: 
     assert contains in resp.data, "Response does not contain %r" % contains 

    if matches: 
     reg = re.compile(matches) 
     assert reg.matches(resp.data), "Response does not match %r" % matches 

    if headers: 
     assert_equal(resp.headers , headers) 

app.py-code:

import web 
from gothonweb import map 

urls = (
     '/game' , 'GameEngine' , 
     '/' , 'Index', 
     ) 

app = web.application(urls, globals()) 
#little hack so that debug mode works with sessions 
if web.config.get('_session') is None: 
    store= web.session.DiskStore('sessions') 
    session= web.session.Session(app, store, initializer={'room':None}) 
    web.config._session = session 
else: 
    session= web.config._session 

render = web.template.render('templates/', base="layout") 

class Index(object): 
    def GET(self): 
     #this is used to "setup" the session with starting values 
     session.room= map.START 
     web.seeother("/game") 

class GameEngine(object): 
    def GET(self): 
     if session.room: 
      return render.show_room(room= session.room) 
     else: 
      #why is there here? do you need it? 
      return render.you_died() 

    def POST(self): 
     form= web.input(action=None) 

     if session.room and form.action: 
      session.room= session.room.go(form.action) 
     else: 
      session.room= None   


if __name__ == "__main__" : 
    app.run() 

Nach der Übung geht voran jetzt gibt es mir 2 Importfehler:

PS C:\lpthw\gothonweb\tests> nosetests 
EE 
====================================================================== 
ERROR: Failure: SyntaxError (invalid syntax (app.py, line 2)) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\nose\loader.py", line 418, in loadTestsFromName 
    addr.filename, addr.module) 
    File "C:\Python27\lib\site-packages\nose\importer.py", line 47, in importFromPath 
    return self.importFromDir(dir_path, fqname) 
    File "C:\Python27\lib\site-packages\nose\importer.py", line 94, in importFromDir 
    mod = load_module(part_fqname, fh, filename, desc) 
    File "C:\lpthw\gothonweb\tests\app_tests.py", line 2, in <module> 
    from bin.app import app 
    File "C:\lpthw\gothonweb\bin\app.py", line 2 
    from gothonweb import map.py 
          ^
SyntaxError: invalid syntax 

====================================================================== 
ERROR: Failure: ImportError (cannot import name map) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\nose\loader.py", line 418, in loadTestsFromName 
    addr.filename, addr.module) 
    File "C:\Python27\lib\site-packages\nose\importer.py", line 47, in importFromPath 
    return self.importFromDir(dir_path, fqname) 
    File "C:\Python27\lib\site-packages\nose\importer.py", line 94, in importFromDir 
    mod = load_module(part_fqname, fh, filename, desc) 
    File "C:\lpthw\gothonweb\tests\map_tests.py", line 2, in <module> 
    from gothonweb import map 
ImportError: cannot import name map 

---------------------------------------------------------------------- 
Ran 2 tests in 0.002s 

FAILED (errors=2) 

Verzeichnisstruktur:

C:/lpthw/ 
    gothonweb/ 
    bin build dist doc sessions Gothonweb templates tests map.py app.py 
tests/ 
map_tests.py 
app_tests.py 
__init__.py 
tools.py 

Was soll ich tun, um den Fehler zu beheben? Danke für die Vorschläge.

+0

Der AssertionError ist nicht Ihr Problem, es ist der AttributeError, den Sie untersuchen sollten. –

+0

Genauer gesagt ist Ihr Fehler in Zeile 29 in app.py, Code, den Sie nicht angegeben haben. –

+0

Ich habe es mit app.py Code aktualisiert, aber ich denke, wir mussten app.py in der Übung, die ich habe, ändern, also ist es nicht die gleiche app.py wie zuvor, da wir ein paar Dinge hinzufügen mussten. –

Antwort

0

Für diesen Fehler

"AttributeError: No template named hello_form"

Einsatz ein absoluter Pfad und sehen, ob das funktioniert,

statt

"render = web.template.render('templates/', base="layout")

Versuch:

"render = web.template.render('C:/lpthw/gothonweb/bin/templates', base="layout") 
0

Erstaunlicherweise Ihr Test hat nichts mit app.py zu tun.

from nose.tools import * 
from bin.app import app 
from tests.tools import assert_response 

def test_index(): 
    #check that we get a 404 on the/URL 
    resp = app.request("/") 
    assert_response(resp, status= "404") 

    #test our first GET request to /hello 
    resp = app.request("/hello") 
    assert_response(resp) 

    #make sure default values work for the form 
    resp = app.request("/hello" , method="POST") 
    assert_response(resp , contains="Nobody") 

    #test that we get expected values 
    data = {'name':'Tejas','greet':'Ola!'} 
    resp = app.request("/hello " , method= "POST", data=data) 
    assert_response(resp , contains="Zed") 

App.py

import web 
from gothonweb import map 

urls = (
     '/game' , 'GameEngine' , 
     '/' , 'Index', 
     ) 

app = web.application(urls, globals()) 
#little hack so that debug mode works with sessions 
if web.config.get('_session') is None: 
    store= web.session.DiskStore('sessions') 
    session= web.session.Session(app, store, initializer={'room':None}) 
    web.config._session = session 
else: 
    session= web.config._session 

render = web.template.render('templates/', base="layout") 

class Index(object): 
    def GET(self): 
     #this is used to "setup" the session with starting values 
     session.room= map.START 
     web.seeother("/game") 

class GameEngine(object): 
    def GET(self): 
     if session.room: 
      return render.show_room(room= session.room) 
     else: 
      #why is there here? do you need it? 
      return render.you_died() 

    def POST(self): 
     form= web.input(action=None) 

     if session.room and form.action: 
      session.room= session.room.go(form.action) 
     else: 
      session.room= None   


if __name__ == "__main__" : 
    app.run() 

Können Sie sehen, wie sie nicht

Ihr erster Test verbunden sind, sagt man eine 404 auf dem '/' url bekommen sollte, aber das wäre nur passieren, wenn '/' nicht existiert. Ihr app.py-Code zeigt deutlich, dass "/" GET in der Indexklasse aufruft.

Zweiter Test, jetzt resp = app.request("/hello"), dass Sie würde einen 404-Fehler, weil die URL auf app.py
existiert nicht

Das gleiche wie ‚/ hallo‘ für den dritten Test geht, existiert nicht in Ihr Tupel von URLs in App.py

Und der fünfte Test als auch

Obwohl die Tests ungültig sind, das primäre Problem, das Sie allerdings haben versucht, den automatisierten Test aus dem Inneren des Tests Verzeichnis auszuführen; das ist falsch.

C:\lpthw\gothonweb\tests> nosetests 

Dies ist nicht das Richtige zu tun, müssen Sie Sie versuchen In app_tests zu arbeiten zB für alle Importe ein Verzeichnis unterhalb sein bin/app.py zu importieren, aber das ist nicht in den ‚Tests‘
Verzeichnis

Führen Sie diese stattdessen

C:\lpthw\gothonweb> nosetests 

diese Weise alle Dateien, die Sie benötigen würde
zurück importiert werden, um app_tests.py. Ich werde einen sehr einfachen Test schreiben, die tatsächlich in engem Zusammenhang steht

from bin.app import app 
from test.tools import assert_response 

def test_index(): 
    #check that we get a 303 on the/url 
    #this is because web.seeother() will always send the browser this http code 
    resp = app.request("/") 
    assert_response(resp, status= "303") 

def test_game(): 
    #check that we get a 200 on /game 
    resp = app.request("/game") 
    assert_response(resp, status = '200') 

    #check that we have response data on a form sumbit 
    resp = app.request("/game", method = 'POST') 
    aseert_response(resp.data) 
0

Die assertion_error app.py Sie, weil Ihr RAN nosetests in diesem Verzeichnis bekommen

/gothroweb/test

Sie sollten führen sie es in /gothroweb

bin docs gothonweb templates tests 

./bin: 
app.py app.pyc __init__.py __init__.pyc 

./docs: 

./gothonweb: 
__init__.py __init__.pyc 

./templates: 
hello_form.html index.html layout.html 

./tests: 
app_tests.py __init__.py test.html tools.pyc 
app_tests.pyc __init__.pyc tools.py 

Prost

Verwandte Themen