【问题标题】:How to Make view_config decorator work with a Pyramid Unit Test?如何使 view_config 装饰器与金字塔单元测试一起使用?
【发布时间】:2015-01-08 23:29:53
【问题描述】:

我为金字塔网络框架写了一个login_required 装饰器。在金字塔测试服务器中它运行良好。

但在 @view_config 装饰器的 Pyramid 单元测试中,不适用于所有配置(不仅是装饰器参数)。

这是代码:

class MyViews(object):
  @view_config(decorator=login_required(login_url=LOGIN_URL),
               match_param="action=change_password", request_method="GET",
               renderer="accounts/change_password.jinja2")
    def change_password(self):
        form = ChangePwdForm()
        return {'form': form}

这里是测试代码:

def test_change_password_fail(self):
        from .views import AccountsViews
        aviews = AccountsViews(testing.DummyRequest(path='/accounts/forget_password'))
        response = aviews.forget_password()
        self.assertEqual(response.status_code, 307)  #HTTPTemporaryRedirect

我的例外是not-logined-user 将被重定向到登录网址。 @view_config 中的所有参数,例如 renderer 和 'match_param' 都不起作用。

我该如何解决这个问题?

参考:
Mocking render to response with Pyramid
Unit and Integration Testing:Pyramid 官方指南,但不涉及基于类的视图的装饰器问题

【问题讨论】:

    标签: python unit-testing web pyramid web-frameworks


    【解决方案1】:

    @view_config() 在您运行 config.scan() 之前不会被应用。

    当您进行测试时,通常您希望测试单个单元,在这种情况下是视图而不用担心框架的其余部分。

    您将分别测试您的视图和装饰器。

    一旦您达到更高的级别,并且想要测试 Pyramid 是否为您的视图做正确的事情,您就会想要进行集成测试。通过集成测试,您将设置完整的配置器对象和完整的应用程序,它更加繁重,但允许您测试 Pyramid 是否应用了装饰器。

    您想要的最后一个测试是模拟完整应用程序的完整端 2 端测试。最新文档位于:http://docs.pylonsproject.org/docs/pyramid/en/latest/narr/testing.html

    【讨论】:

    • 感谢您的回答。但不幸的是,您引用的文档没有关于如何测试装饰器的内容。我使用了 config.include ,然后,有些东西可以工作(例如add_directive,其他的则不行(例如add_request_method))。金字塔的虚拟请求对象有问题。我只能手动添加,比如添加matchdict等等。
    • 你试过打电话给config.scan('.views')吗?我将尝试构建一个示例,看看我是否可以弄清楚如何测试这样的东西。 webtest 应该可以工作,因为它会端到端测试您的应用程序。
    • 是的,我做到了:),扫描只是添加 view_config,但设置不适用于虚拟请求对象。Pyramid 没有传递任何参数来查看 callable.URL 调度不起作用,view_config.Pyramid 的官方文档假设我们使用 pyramid.request.Request 来做到这一点。在金字塔的官方 github repo 中没有任何关于如何测试 url dispatch 和 decoraotr 的测试示例。现在我只是手动添加请求方法和属性:)。阅读源码太抽象了,因为时间有限就放弃了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2016-12-30
    • 1970-01-01
    • 2019-08-30
    相关资源
    最近更新 更多