我有一个使用url dispatch的现有Pyramid应用程序。它的网址格式为' / kind1 / {id1} / kind2 / {id2} ... / action'。因此,遍历应该是理想的,但它没有被使用。
在每个视图中都有一个函数调用,用于从url中获取实例。例如,可能会有thingy_instance = get_thingy_from_url(request)
现在我需要为视图添加权限。所以我在路由配置中添加了上下文工厂。类似于:config.add_route('thingy_action','/kind1/{id1}/kind2/{id2}.../action', factory='ThingyContext')
现在,ThingyContext可以获取该内容,因此在视图中我可以执行thingy_instance = request.context.thingy_instance
之类的内容,而不是thingy_instance = get_thingy_from_url(request)
到目前为止,这是非常直接和可行的。但它打破了直接测试视图的所有单元测试,因为请求上下文没有被填充。
例如,像这样的测试:
def test_thingy_action_scenario(self):
stuff...
x = thingy_action(request)
会给我一个例外:
Traceback (most recent call last):
File "/home/sheena/Workspace/Waxed/waxed_backend/waxed_backend/concerns/accountable_basics/tests/view_tests.py", line 72, in test_alles
self.assertRaises(UserNotFound,lambda:get_user(request))
File "/usr/lib/python2.7/unittest/case.py", line 473, in assertRaises
callableObj(*args, **kwargs)
File "/home/sheena/Workspace/Waxed/waxed_backend/waxed_backend/concerns/accountable_basics/tests/view_tests.py", line 72, in <lambda>
self.assertRaises(UserNotFound,lambda:get_user(request))
File "/home/sheena/Workspace/Waxed/waxed_backend/waxed_backend/concerns/accountable_basics/views.py", line 69, in get_user
oUser = request.context.oUser
AttributeError: 'NoneType' object has no attribute 'thingy_instance'
简而言之。在测试中request.context
是无。但是当通过他们的网址访问视图时,一切正常。
例如:这种事情适用于新设置curl -X POST --header 'Accept: application/json' 'http://stuff/kind1/{id1}/kind2/{id2}.../action/'
那么处理这个问题的优雅方式是什么?我想在视图中使用上下文,并让测试通过。
答案 0 :(得分:1)
您正在寻找功能测试而不是单元测试。在金字塔中,视图本身就是“只是函数”,并且没有做任何事情来填充上下文等。在所有其他事情发生之后,金字塔的路由器会调用它们。但是你没有在这些测试中使用路由器,所以这些都没有发生。
如果您只想在单元测试中测试视图函数本身,那么您可以设置测试集request.context = ThingyContext(...)
,并且您的视图应该很满意。
如果你想更像测试像curl这样的客户端测试它,你想要使用webtest。
from webtest import TestApp
app = config.make_wsgi_app()
testapp = TestApp(app)
response = testapp.get('/')
这将需要一个完整的应用程序,而不仅仅是视图功能。