2012-04-10 1 views
1

lib.pyDjango 테스트에서이 도우미 기능을 조롱하고 있습니까?

from django.core.urlresolvers import reverse 
def render_reverse(f, kwargs): 
    """ 
    kwargs is a dictionary, usually of the form {'args': [cbid]} 
    """ 
    return reverse(f, **kwargs) 

tests.py

from lib import render_reverse, print_ls 

class LibTest(unittest.TestCase): 

def test_render_reverse_is_correct(self): 
    #with patch('webclient.apps.codebundles.lib.reverse') as mock_reverse: 
    with patch('django.core.urlresolvers.reverse') as mock_reverse: 
     from lib import render_reverse 
     mock_f = MagicMock(name='f', return_value='dummy_views') 
     mock_kwargs = MagicMock(name='kwargs',return_value={'args':['123']}) 
     mock_reverse.return_value = '/natrium/cb/details/123' 
     response = render_reverse(mock_f(), mock_kwargs()) 

     print mock_reverse.mock_calls # prints [] 
    print mock_reverse.mock_calls # prints [] 
    self.assertTrue('/natrium/cb/details/' in response) 

하지만 그 대신, 나는

File "/var/lib/graphyte-webclient/graphyte-webenv/lib/python2.6/site-packages/django/core/urlresolvers.py", line 296, in reverse 
    "arguments '%s' not found." % (lookup_view_s, args, kwargs)) 
NoReverseMatch: Reverse for 'dummy_readfile' with arguments '('123',)' and keyword arguments '{}' not found. 

왜 대신 mock_reverse (이것은 내의 reverse를 호출 수 내 urls.py를 찾고 !!) calls이 빈 목록을 반환하는 것을 볼 수 있습니다. 나는 심지어 assert mock_reverse.called이고 false를 반환했습니다.

아마도이 문제에 대해서는 언급하지 않았지만 lib는 많은 기능을 제공합니다. 클래스가 없습니다.

답변

1

두 가지. 1. Django에서 reverse 패치를해야합니다. 2. lib 모듈 가져 오기를 조롱 한 reverse을 만들기 위해 컨텍스트 관리자 내에서 가져 오기를 수행해야합니다.

from lib import print_ls 

class LibTest(unittest.TestCase): 

    def test_render_reverse_is_correct(self): 
     with patch('django.core.urlresolvers.reverse') as mock_reverse: 
      from lib import render_reverse 
      mock_f = MagicMock(name='f', return_value='dummy_view') 
      mock_kwargs = MagicMock(name='kwargs',return_value={'args':['123']}) 
      mock_reverse.return_value = '/natrium/cb/details/123' 
      response = render_reverse(mock_f, mock_kwargs) 

     self.assertTrue('/natrium/cb/details/' in response) 
+0

감사합니다. 글쎄, 내가 Michael의 스크린 캐스트를 보았다고 말했듯이, View 함수는 Poll.objects.get_filter를 호출하므로, 그는 그것을 (객체를 요청할뿐만 아니라) 조롱했다. 그래서 나는 우리가 실제 '반대'에 의존하기를 원하지 않기 때문에 옳은 일이라고 생각했습니다. – CppLearner

+0

@CppLearner 당신의 코드를 다시 읽었는데 왜 이제'render_reverse'가 필요한지 이해가 안됩니다. 어떤 과제를 해결합니까? 보통의 '역방향'을 사용하지 않는 이유는 무엇입니까? – DrTyrsa

+0

감사. 네. 나는'render_reverse'를 만드는 것에 대해 잘못된 것이었지만'render_reverse'를 장고 내장 함수로 전달하기 전에 무언가를하는 래퍼로 생각합시다. 이미'reverse'를 패치했는데, 아직도'reverse'를 내장하고있는 이유는 무엇입니까? 나의 가난한 이해는 패치 할 때 모의 버전을 사용하기 때문에'render_reverse'가 내 기대 값을 반환해서는 안되는가? – CppLearner

0

키워드 인수 (사전 임)를 전달하지 않고 대신 위치 지정 인수 (튜플)를 전달합니다.

또한 역방향 프록시 메소드는 위치 인수가 아닌 키워드 인수 만 전달합니다.

마지막으로 요청한 패턴과 일치하는 URL이 없습니다. 키워드 인수를 전달하지 않았으므로 위치 인수 만 전달했기 때문입니다.

+0

감사합니다. 왜 사전을 돌려 보내지 않는거야? 나는'mock_f.return_value'와'mock_f()'도 시도했다. 나는 여전히 같은 오류로 끝납니다. 예상되는 인수 전달은 다음과 같습니다.'response = render_reverse ('codebundle_homepage', { 'args': [cbid]})'이 하드 코딩 된 코드가 작동합니다. – CppLearner

+0

BTW 사례의 99 %에서 장고는 인수를 전달하는 방법에 대해 신경 쓰지 않습니다. 'kwargs'와'args'를 사용하여 같은 뷰를'되돌릴 수 있습니다. – DrTyrsa

관련 문제