如何在金字塔中对 request.json_body 进行单元测试?

How to unit test request.json_body in pyramid?

我使用字段 request.json_body 来检索编码的 json 正文,例如:

@view_config(route_name='reminder', renderer='json', permission='view', xhr=True, request_method='POST')
def reminder(request):
    process(body.request.json_body)
    return {'result':'OK'}

我如何对此进行单元测试(我是 python 新手,使用 3.4.4)。我使用了金字塔测试中的 DummyRequest(),但是当 运行 测试它抱怨时:

'DummyRequest' object has no attribute 'json_body'

据我了解,DummyRequest 受到限制。 我怎样才能用 json 正文填充 "test" 请求? 我想我看错了角落,因为我不能 (google) 关于这个的好信息:(

有几种方法可以做到这一点。我喜欢使用 WebTest,它允许您从可调用的 wsgi 中创建一个测试应用程序,然后您可以调用此测试 object 来发送和发送 json。简而言之,它看起来像这样:

   # my_app is a wsgi callable
    test_app = webtest.TestApp(my_app)
    # my json post body as a dict
    params = {'name': 'Iain', 'quest': 'find grail'}
    response = test_app.post_json('/cross_bridge', params=params})
    assert response.json['status'] == 'success', "should be a success msg"

我们书呆子会争论这是单元测试还是集成测试还是功能测试,但我认为这就是您要找的。 WebTest 文档有更多示例。请注意,您还可以传入将进入 WSGI dict 的值,并且有用于传入 headers 和验证 headers 的方法。我们将其与 Pyramid 的远程用户身份验证策略一起使用,以设置哪个用户登录请求。我用标准单元测试 classes 包装了整个东西,用一个基础 class 来做我的额外样板。

您可以在创建对象时将其作为构造函数参数。

testing.DummyRequest(json_body=json_params, method='POST')

这应该有效。适合我