我是web.py的新手。我正在关注ex52 LPTHW,我不得不在tests文件夹中的所有测试中执行nosetests。但由于断言错误,我得到1次测试失败。我试着阅读不同的断言错误以及它们为什么会出现,但我无法弄清楚这一点。我尝试扩展服务器可能出现的错误,如500 Internal,400但它仍然没有通过测试。我已经创建了其他代码,就像书中提到的那样:http://learnpythonthehardway.org/book/ex52.html
这是我的追溯:
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代码:
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个导入错误:
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)
目录结构:
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 :(得分:0)
对于此错误,
“AttributeError:没有名为hello_form的模板”
使用绝对路径并查看是否有效,而不是
"render = web.template.render('templates/', base="layout")
尝试:
"render = web.template.render('C:/lpthw/gothonweb/bin/templates', base="layout")
答案 1 :(得分: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()
你能看出,他们之间没有关系吗
你的第一个测试表明你应该在'/'网址上获得404,但这只会在'/'不存在的情况下发生。您的app.py代码清楚地显示“/”在Index类中调用GET。
第二次测试resp = app.request("/hello")
现在会给你一个404错误,因为app.py上不存在这个网址
第三次测试同样如此,因为app.py中的url元组中不存在'/ hello'
第五次测试以及
虽然您的测试无效,但您遇到的主要问题是尝试从tests目录中执行自动化测试;那是错的。
C:\lpthw\gothonweb\tests> nosetests
这不是正确的做法,你需要成为下面的目录才能使你的所有导入工作,例如在app_tests中你试图导入bin / app.py但是那不在'tests'目录中
改为
C:\lpthw\gothonweb> nosetests
这样就可以导入所需的所有文件 回到app_tests.py。我会写一个非常简单的测试,它实际上与app.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)
答案 2 :(得分:0)
您获得的assertion_error是因为您在此目录中运行nosetests
/ gothroweb / test
你应该运行它 / 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
欢呼