在Python Google App Engine项目中使用gae-session进行Nosegae单元测试
我在使用单元测试的时候,无法让gae-sessions正常工作。我不确定这是因为cookie的问题,还是gae-sessions内部的问题(它使用memcache或数据存储来保存数据)。在通过浏览器访问实际应用时,一切都运行得很好。
我在Mac OS 10.6.6上使用Python 2.5,Google App Engine SDK 1.4.2,nosetests版本1.0.0,NoseGAE-0.1.7和gae-sessions v1.06。
这是我的代码:
网页应用的实现:
from google.appengine.ext import webapp
from gaesessions import get_current_session
class cookietest(webapp.RequestHandler):
def get(self):
s = get_current_session()
if not 'message' in s:
self.response.out.write('No session value')
s['message'] = 'This value is stored in a session'
else:
self.response.out.write("Message found: %s" % s['message'])
application = webapp.WSGIApplication([(r'/cookietest', cookietest)])
单元测试的实现:
def test_cookietest(self):
from gaesessions import SessionMiddleware
app_with_sessions = SessionMiddleware(application, cookie_key=os.urandom(64)) # random key
self.app = TestApp(app_with_sessions)
resp = self.app.get('/cookietest')
cookie = resp.headers['Set-Cookie']
assert cookie
resp = self.app.get('/cookietest', headers={'Cookie': cookie})
print resp
assert 'This value is stored in a session' in resp
相关的输出是:
FAIL: test_cookietest (tests.test.TestUser)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/Asad/.../test.py", line 33, in test_cookietest
assert 'This value is stored in a session' in resp
AssertionError:
-------------------- >> begin captured stdout << ---------------------
Response: 200 OK
Cache-Control: no-cache
Content-Type: text/html; charset=utf-8
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Set-Cookie: DgU00="DQjpTdhQsKYYGhvNr/CLm+v835QV5V1jTX9T4wMULhI=1301034363_89b1c1007a6159e85828ab9a7673759cgAJ9cQB9cQFVB21lc3NhZ2VxAlUhVGhpcyB2YWx1ZSBpcyBzdG9yZWQgaW4gYSBzZXNzaW9ucQNzhnEELg=="; expires=Fri, 25-Mar-2011 06:26:03 GMT; Path=/; HttpOnly
No session value
--------------------- >> end captured stdout << ----------------------
-------------------- >> begin captured logging << --------------------
root: WARNING: Could not read datastore data from /var/folders/pt/ptPaW5O7E-eLIrfFhhczbU+++TI/-Tmp-/nosegae.datastore
root: INFO: zipimporter('/Library/Python/2.5/site-packages/NoseGAE-0.1.7-py2.5.egg', '')
root: INFO: zipimporter('/Library/Python/2.5/site-packages/WebTest-1.2.3-py2.5.egg', '')
root: INFO: zipimporter('/Library/Python/2.5/site-packages/WebOb-1.0-py2.5.egg', '')
root: INFO: zipimporter('/Library/Python/2.5/site-packages/mock-0.7.0b4-py2.5.egg', '')
root: DEBUG: Could not import "strop": Disallowed C-extension or built-in module
--------------------- >> end captured logging << ---------------------
----------------------------------------------------------------------
Ran 10 tests in 0.284s
FAILED (failures=1)
1 个回答
4
我觉得你需要手动保存这个测试中的会话。
if not 'message' in s:
self.response.out.write('No session value')
s['message'] = 'This value is stored in a session'
s.save()
更新:
gae-sessions 是从 os.environ['HTTP_COOKIE']
这个变量中获取会话的 cookie。这个值需要在 self.app.get
请求之前设置,而不是通过 headers
参数传入 cookie。