代码之家  ›  专栏  ›  技术社区  ›  Dmitrii

Django测试:当为视图指定login\u required时,如何比较resolve()和view函数的结果

  •  0
  • Dmitrii  · 技术社区  · 7 年前

    在里面 URL。py公司 我有我的观点 细节 注释为 需要登录 要将未经授权的用户转发到登录页面:

    url(r'^(?P<id>[0-9]+)/$', login_required(views.detail), name = 'detail')
    

    我正试图编写一个测试来检查在查询目标url时选择了哪个视图。在测试开始之前,我要登录一个类:

    class LoggedInTestCase(TestCase):
        def setUp(self):
            user = User.objects.create_user('test', 'test@example.com', 'test')
            self.client.login(username='test', password='test')
    
    class ProductDetailTest(LoggedInTestCase):
        def setUp(self):
            super(ProductDetailTest, self).setUp()
    
        def test_product_detail_url_resolves_product_detail_view(self):
            view = resolve('/products/1/')
            self.assertEquals(view.func, detail)
    

    当我运行测试时,我得到:

    FAIL: test_product_detail_url_resolves_product_detail_view (products.tests.ProductDetailTest)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\heroku\django\products\tests.py", line 46, in test_product_detail_url_resolves_product_detail_view
        self.assertEquals(view.func, detail)
    AssertionError: <function detail at 0x05CC3780> != <function detail at 0x053B38A0>
    
    ----------------------------------------------------------------------
    

    检查已解析的视图

        print('VIEW: ', view.view_name)
    

    结果是:

    test_product_detail_url_resolves_product_detail_view (products.tests.ProductDetailTest) ... VIEW:  products:detail
    

    当我删除时 需要登录

    1 回复  |  直到 7 年前
        1
  •  1
  •   Alasdair    7 年前

    当你这么做的时候 login_required(detail) ,装饰器返回一个新函数。您的断言应该在测试中失败,因为函数不同。

    这里有几个选项。在视图中使用装饰器可能是最简单的:

    @login_required
    def detail(request, *args, **kwargs)
        ...
    

    并将url模式更改为:

    url(r'^(?P<id>[0-9]+)/$', views.detail, name = 'detail'),
    

    如果你需要使用未装饰的 detail 视图,那么你不能像那样使用装饰器。在这种情况下,您可以指定 需要登录(详细信息) 新变量,

    def detail(request, *args, **kwargs):
        ...
    
    login_required_detail = login_required(detail)
    

    将URL模式更改为,

    url(r'^(?P<id>[0-9]+)/$', views.login_required_detail, name = 'detail'),
    

    并将测试更改为:

    self.assertEquals(view.login_required_detail, detail)