1

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、それはfalseを返しました。

たぶん私はこれについて言及していませんが、libは単なる関数の集まりであり、クラスはありません。

4

2 に答える 2

1

2つのこと。1.Djangoからパッチを適用する必要がありますreverselib2.モジュールのインポートをモックにするには、コンテキストマネージャー内でインポートを行う必要があります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)
于 2012-04-10T09:47:01.493 に答える
0

キーワード引数(辞書)を渡すのではなく、位置引数(タプル)を渡します。

さらに、リバースするプロキシメソッドはキーワード引数のみを渡し、位置引数は渡しません。

最後に、要求されたパターンに一致するURLがありません。キーワード引数を渡さず、位置引数のみを渡したためです。

于 2012-04-10T09:05:48.533 に答える