我正在尝试使用webapp2对处理程序进行单元测试,并且遇到的只是一个愚蠢的小错误。
我希望能够在测试中使用webapp2.uri_for,但我似乎无法做到这一点:
def test_returns_200_on_home_page(self):
response = main.app.get_response(webapp2.uri_for('index'))
self.assertEqual(200, response.status_int)
如果我只做main.app.get_response('/')
它就可以了。
收到的例外是:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 318, in run
testMethod()
File "tests.py", line 27, in test_returns_200_on_home_page
webapp2.uri_for('index')
File "/Users/.../webapp2_example/lib/webapp2.py", line 1671, in uri_for
return request.app.router.build(request, _name, args, kwargs)
File "/Users/.../webapp2_example/lib/webapp2_extras/local.py", line 173, in __getattr__
return getattr(self._get_current_object(), name)
File "/Users/.../webapp2_example/lib/webapp2_extras/local.py", line 136, in _get_current_object
raise RuntimeError('no object bound to %s' % self.__name__)
RuntimeError: no object bound to request
我缺少一些愚蠢的设置吗?
答案 0 :(得分:14)
我认为唯一的选择是设置一个虚拟请求,只是为了能够为测试创建URI:
def test_returns_200_on_home_page(self):
// Set a dummy request just to be able to use uri_for().
req = webapp2.Request.blank('/')
req.app = main.app
main.app.set_globals(app=main.app, request=req)
response = main.app.get_response(webapp2.uri_for('index'))
self.assertEqual(200, response.status_int)
切勿在测试之外使用set_globals()
。是由WSGI应用程序调用以线程安全的方式设置活动应用程序和请求。
答案 1 :(得分:0)
webapp2.uri_for()
假设您处于Web请求上下文中,但由于无法找到request
对象而失败。
您可以将应用程序视为一个黑盒子而不是解决此问题,并使用文字URI来调用它,例如{I} '/'
。毕竟,您想要模拟普通的Web请求,而Web浏览器也将使用URI而不是内部路由快捷方式。