2016-05-13 16 views
2

私はweb.pyを初めて使用しています。私はex52 LPTHWに従っていたので、testsフォルダのすべてのテストでnosetestsを実行しなければなりませんでした。しかし、アサーションエラーのために1回のテストに失敗しました。私は別のアサーションエラーを読んでみたが、なぜそれらが発生するのか、私はこの1つを理解できない。私はサーバーが500 Internal、400のように表示される可能性があるエラーを拡大しようとしましたが、それでもテストに失敗しました。私は本の中で言及しただけのような他のコードを作成しました:ここhttp://learnpythonthehardway.org/book/ex52.htmlnosetestsを実行する際のPython-アサーションエラー

は私のトレースバックです:

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) 

私のテストコード: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コード:

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) 

ディレクトリ構造:運動を進めて行く後

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() 
は、今では私に2つのインポートエラーを与える

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 

私はエラーを修正するにはどうすればよいですか?提案していただきありがとうございます。このエラーの

+0

AssertionErrorは問題ではありません。調査する必要があるのはAttributeErrorです。 –

+0

より具体的には、提供していないapp.pyのコード29行目のエラーです。 –

+0

私はapp.pyコードでそれを更新しましたが、前のようにapp.pyと同じapp.pyではないので、いくつか追加する必要があったので、先にapp.pyを変更しなければならなかったと思います。 –

答えて

0

"AttributeError: No template named hello_form"

代わり

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

試みで、絶対パスを使用し、それが動作するかどうかを参照してください。驚く

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

、あなたのテストを持っていますapp.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") 

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


あなたの最初のテストは、あなたが '/' URLに404を取得する必要がありますと言うが、それだけだろう'/'が存在しない場合に起こります。あなたのapp.pyコードは、IndexクラスのGETで '/'が呼び出されたことを明確に示しています。そのURLがapp.py

上に存在しないため、

第二に、テスト、resp = app.request("/hello")は今、それはあなたに404エラーを与えるだろうと同じでは「/ハロー」と第三の試験のために行くには存在しません。あなたのアプリのタプル。PY

そして、第五の試験だけでなく

あなたのテストは無効ですが、あなたがが持っている主要な問題は、testsディレクトリ内から自動テストを実行しようとしています。それは間違っている。

C:\lpthw\gothonweb\tests> nosetests 

これを行うには正しいことではありません、あなたはすべてのあなたの輸入はあなたがビン/ app.pyをインポートしようとしているapp_testsでは例えば仕事にするために、以下のディレクトリである必要がありますが、それは「テスト」ではありませんディレクトリ

C:\lpthw\gothonweb> nosetests 

に代わり、あなたが必要とするすべてのファイルが戻るapp_tests.pyに
をインポートすることでしょう。この方法でこれを行います。私は実際に

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

にあなたがあなたがこのディレクトリに自分の走ったnosetests

/gothroweb /テスト

のでべきで取得assertion_errorをapp.pyに関連しています非常に簡単なテストを書きます /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 
でそれを実行します

歓声

関連する問題