python - 我是否在 Django 测试中 mock 这个辅助函数?

标签 python django unit-testing mocking django-testing

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)

测试.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 返回一个空列表。我什至断言mock_reverse.called并且它返回了false。

也许我没有提到这一点,但是lib只是一堆函数,没有类。

最佳答案

有两件事。 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)

关于python - 我是否在 Django 测试中 mock 这个辅助函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10085763/

相关文章:

python - 避免比较数字和字符串的错误

javascript - 更新audio.currentTime重置为0-意外行为(Django?)

python - Django+Gunicorn+nginx Internal Server Error,错误在哪里,如何解决?

java - JUnit 测试用例@Before 和@After 注解

c++ - 单元测试 .cpp 操作方法

python - 图像分析曲线拟合

python - 如何对 Pandas 数据透视表中的值进行排序?

c# - 如何使用 Moq 从 Repository 中正确伪造 IQueryable<T>?

python - Numpy sum() 出现 'keepdims' 错误

python - Django:如何允许可疑文件操作/复制文件