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는 많은 기능을 제공합니다. 클래스가 없습니다.
감사합니다. 글쎄, 내가 Michael의 스크린 캐스트를 보았다고 말했듯이, View 함수는 Poll.objects.get_filter를 호출하므로, 그는 그것을 (객체를 요청할뿐만 아니라) 조롱했다. 그래서 나는 우리가 실제 '반대'에 의존하기를 원하지 않기 때문에 옳은 일이라고 생각했습니다. – CppLearner
@CppLearner 당신의 코드를 다시 읽었는데 왜 이제'render_reverse'가 필요한지 이해가 안됩니다. 어떤 과제를 해결합니까? 보통의 '역방향'을 사용하지 않는 이유는 무엇입니까? – DrTyrsa
감사. 네. 나는'render_reverse'를 만드는 것에 대해 잘못된 것이었지만'render_reverse'를 장고 내장 함수로 전달하기 전에 무언가를하는 래퍼로 생각합시다. 이미'reverse'를 패치했는데, 아직도'reverse'를 내장하고있는 이유는 무엇입니까? 나의 가난한 이해는 패치 할 때 모의 버전을 사용하기 때문에'render_reverse'가 내 기대 값을 반환해서는 안되는가? – CppLearner