如何在单元测试时获得实际的金字塔请求

Jef*_*eff 5 python unit-testing pyramid

我有一个金字塔应用程序,我还在努力学习.我应该为它编写单元测试,但我不知道如何构建请求.

我看到Pyramid有一个带有a的测试模块,DummyRequest但这是空白的,显然如果我将它传递给视图,它将会失败,因为它没有填充请求在运行时具有的属性.

所以问题是,如何在测试时传递一个看起来像运行时请求的请求?

Mic*_*kel 9

无论何时进行单元测试(与功能测试不同),要实现的是您正在测试一个小的"单元".此单元(在本例中为您的视图)不需要"真实"请求,也不需要完全正常工作的系统.这种观点对于一个自称为"请求"的对象可能有什么期望有一定的期望,但这就是它,它肯定不需要真实请求中的所有可用内容.这是模拟或虚拟对象发挥作用的地方.您希望测试视图,因此您可以使用所需的属性将某些内容传递到视图中,以检查它是否正在执行此任务.假设您有以下配置:

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个属性,matchdictdb.那么我们可以这样做:

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来帮助确保整个应用程序按预期工作,但这不是单元测试的领域.