2016-12-06 17 views
0

は(myapp/getters.pyで)少しクラスです:Djangoモデルマネージャのメソッドをモックできますか?ここ

from django.contrib.auth.models import User 

class UserGetter: 
    def get_user(self): 
     return User.objects.get(username='username') 

私は、User.objects.getへの呼び出しをモックMagicMockを返し、この方法は、私が注入されたものを返すことをテストしたいと思います。

from unittest import TestCase 
from django.contrib.auth.models import User, UserManager 
from mock import patch, create_autospec 
from myapp.getters import UserGetter 

class MockTestCase(TestCase): 
    @patch('myapp.getters.User', autospec=True) 
    def test(self, user_class): 
     user = create_autospec(User) 
     objects = create_autospec(UserManager) 
     objects.get.return_value = user 
     user_class.objects.return_value = objects 
     self.assertEquals(user, UserGetter().get_user()) 

しかし、私は(python manage.py test myapp.tests.tests_gettersで)このテストを実行するとき、私はなぜ私が注入されたモックを取り戻すません

AssertionError: 
    <MagicMock name='User.objects().get()' spec='User' id='4354507472'> != 
    <MagicMock name='User.objects.get()' id='4360679248'> 

を得る:myapp/tests/tests_getters.pyで?どうすればこのテストを正しく書くことができますか?

答えて

1

私はこれがあなたの問題だと思う:

user_class.objects.return_value = objects 

あなたが右側にあるオブジェクトを返す関数「オブジェクト」を持っているモックを指示します。
しかし、あなたのコードはオブジェクト()関数を呼び出すことはありません。これはUser.objectsプロパティにアクセスします.UserはここでMockであるため、Userはプロパティアクセスで新しいMockを返します。

+0

これだけです。解決策は 'user_class.objects.return_value = objects'を' user_class.objects = objects'に変更することです。 'User'にパッチを当てずに' User.objects'に割り当てるだけでも動作しますが、他のテストを汚染すると思われます。 –

関連する問題