2017-10-12 83 views
0

urls.py我有我的看法详细注释login_required转发未经授权的用户登录页面:Django的测试:如何为指定login_required当比较解析()与视功能的结果是视图

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

而我试图编写一个测试来检查在查询目标网址时选择哪个视图。我有一个类来登录测试开始之前:

class LoggedInTestCase(TestCase): 
    def setUp(self): 
     user = User.objects.create_user('test', '[email protected]', '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 

当我删除login_required所有测试都通过。

回答

1

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

这里有几个选项。这可能是使用最简单的装饰中的观点:

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

和URL模式更改为:

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

如果您需要使用未修饰detail观点,那么你不能使用装饰者就是这样。在这种情况下,您分配login_required(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) 
+0

谢谢,我怀疑这种行为但我怀疑是否有一些特殊的断言功能来检查装饰的功能。使用@login_required注释功能正常工作。 – Dmitrii

+0

不,没有内置的断言可以为您打开装饰后的功能。看起来好像在Python 3中[很好地解开装饰函数](https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch09s03.html)。但是改变视图/我上面建议的测试更简单。 – Alasdair