lib.py
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.
为什么调用reverse
而不是mock_reverse
(它正在查找我的urls.py !!)
您可以看到calls
返回一个空列表。我甚至assert mock_reverse.called
并且它返回了假。
也许我没有提到过这个,但是lib只是一堆函数,没有类。
答案 0 :(得分: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)
答案 1 :(得分:0)
您没有传递任何关键字参数(这是一个字典),而是传递位置参数(元组)。
此外,您的反向代理方法只传递关键字参数而不传递位置参数。
最后,您没有与请求的模式匹配的URL - 因为您没有传递任何关键字参数,只传递位置参数。