2017-10-12 15 views
0

urls.py에서 그 :장고 시험 : 지정된 경우 login_required 뷰 기능으로 해결()의 결과를 비교하는 방법 내가 내보기 권한이없는 사용자가 페이지를 로그인 전달하는</em>을 login_required <em>주석 <em>세부</em>이보기

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', '[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) 

를 해결하는보기 확인 결과 is :

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 패턴을 변경합니다 : 그것은보기에 데코레이터를 사용하는 것이 가장 간단 수 있습니다 당신은 꾸며지지 않은 detail보기를 사용해야하는 경우

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

login_required(detail)를 지정하고 테스트를 변경합니다

self.assertEquals(view.login_required_detail, detail) 
+0

감사합니다, 나는이 문제를 의심 하지만 장식 된 것을 확인하는 특별한 어설 션 기능이 있다면 의심 스럽다. @login_required 함수에 주석을 달아도 문제가 없습니다. – Dmitrii

+0

아니요, 데코 레이팅 된 기능을 언 래핑하는 어설 션이 없습니다. 파이썬 3에서 (데코 레이팅 된 함수를 푸는 것은) 가능할 것 같습니다 (https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch09s03.html).하지만 뷰를 바꾸면/위에서 제안한 테스트는 더 간단합니다. – Alasdair