Jef*_*eff 5 python unit-testing pyramid
我有一个金字塔应用程序,我还在努力学习.我应该为它编写单元测试,但我不知道如何构建请求.
我看到Pyramid有一个带有a的测试模块,DummyRequest但这是空白的,显然如果我将它传递给视图,它将会失败,因为它没有填充请求在运行时具有的属性.
所以问题是,如何在测试时传递一个看起来像运行时请求的请求?
无论何时进行单元测试(与功能测试不同),要实现的是您正在测试一个小的"单元".此单元(在本例中为您的视图)不需要"真实"请求,也不需要完全正常工作的系统.这种观点对于一个自称为"请求"的对象可能有什么期望有一定的期望,但这就是它,它肯定不需要真实请求中的所有可用内容.这是模拟或虚拟对象发挥作用的地方.您希望测试视图,因此您可以使用所需的属性将某些内容传递到视图中,以检查它是否正在执行此任务.假设您有以下配置:
def main():
config = Configurator()
config.add_route('user', '/users/{uid}')
return config.make_wsgi_app()
@view_config(route_name='user', renderer='user_template.mako')
def user_view(request):
uid = request.matchdict['uid']
user = find_user(request, uid)
if user is None:
raise HTTPNotFound
return {'user': user}
def find_user(request, uid):
return request.db.query(User).filter_by(id=uid).first()
Run Code Online (Sandbox Code Playgroud)
很好,所以这是一个真实的视图,你会注意到它只需要请求有2个属性,matchdict和db.那么我们可以这样做:
class Test_user_view(unittest.TestCase):
def test_it(self):
req = DummyRequest()
req.db = DummyDB()
req.matchdict = {'uid': '3'}
result = user_view(req)
self.assertEqual(result['user'].id, 3)
Run Code Online (Sandbox Code Playgroud)
现在我们在这里没有解决的一件事是实现,DummyDB但更好的方法可能是模拟输出find_user虚拟值.这使测试变得简单并专注于视图本身,而不会在与数据库交谈时陷入困境.那是一个单独的测试.
这里的其他答案更全面地介绍了功能测试,您应该确定使用WebTest来帮助确保整个应用程序按预期工作,但这不是单元测试的领域.
| 归档时间: |
|
| 查看次数: |
4573 次 |
| 最近记录: |