2017-06-20 4 views
0

私は単体テストではあまり実験されていませんが、私は以下のエラーが発生していて修正できませんでした。お願いします。おかげAttributeError:<バインドメソッドManager.get of <django.db.models.manager.Manager>

これはがエラーを返されます。

====================================================================== 
ERROR: test_authenticate_credentials_for_inactive_user (apps.authentication.tests.test_authentication.AuthenticateCredentialsTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/usr/local/site-packages/mock/mock.py", line 1297, in patched 
    arg = patching.__enter__() 
    File "/usr/local/site-packages/mock/mock.py", line 1369, in __enter__ 
    original, local = self.get_original() 
    File "/usr/local/site-packages/mock/mock.py", line 1343, in get_original 
    "%s does not have the attribute %r" % (target, name) 
AttributeError: <bound method Manager.get of <django.db.models.manager.Manager object at 0x00000000015bd168>> does not have the attribute 'has_expired' 

これはコードです:

class ExpiringTokenAuthentication(TokenAuthentication): 
    """ 
    Extends token auth with inactivity expiration mechanism. 
    """ 
    model = ExpiringToken 

    def authenticate_credentials(self, key): 

     try: 
      token = self.model.objects.get(key=key) 
     except self.model.DoesNotExist: 
      raise exceptions.AuthenticationFailed('Invalid token') 

     if not token.user.is_active: 
      raise exceptions.AuthenticationFailed('Invalid user') 

     if token.has_expired(): 
      raise exceptions.AuthenticationFailed('Token has expired') 

unittestの:

class AuthenticateCredentialsTest(TestCase): 

    def setUp(self): 
     self.ExpiringTokenAuth = ExpiringTokenAuthentication() 


    @patch('apps.authentication.authentication.ExpiringTokenAuthentication.model.objects.get') 
    @patch('apps.authentication.authentication.ExpiringTokenAuthentication.model.objects.get.user.is_active') 
    @patch('apps.authentication.authentication.ExpiringTokenAuthentication.model.objects.get.has_expired') 
    def test_authenticate_credentials_for_inactive_user(self, mock_token, active_user, expired_token): 
     active_user.return_value = True 
     expired_token.return_value = False 
     with self.assertRaises(exceptions.AuthenticationFailed) as ea: 
      self.ExpiringTokenAuth.authenticate_credentials('valid key') 

答えて

0

問題は、.get()メソッドでオブジェクトの返り値をパスしようとしています。これは動作しません。インスタンスを自分自身にパッチする必要があります。

@patch('apps.authentication.authentication.ExpiringTokenAuthentication.model.objects.get') 
@patch('apps.authentication.authentication.token.user.is_active') 
@patch('apps.authentication.authentication.token.has_expired') 
def test_authenticate_credentials_for_inactive_user(self, mock_token, active_user, expired_token): 
    active_user.return_value = True 
    expired_token.return_value = False 
    with self.assertRaises(exceptions.AuthenticationFailed) as ea: 
     self.ExpiringTokenAuth.authenticate_credentials('valid key') 
+0

私は今、このエラーを取得しています: 'はImportErrorを:apps.authentication.authentication.ExpiringTokenAuthentication ' – fatah

+0

という名前のモジュールがapps.authentication.authentication.ExpiringTokenAuthentication '(最初のパッチ@patchでこれを試していません.model.objects.get '、autospec = True) –

+0

まだ同じエラーがあります。これを行う簡単な方法がないのだろうか? – fatah

0

別のテストでそれぞれのケースを分離することができます。たとえば:

class AuthenticateCredentialsTest(TestCase): 

def setUp(self): 
    self.ExpiringTokenAuth = ExpiringTokenAuthentication() 
    self.token = ExpiringToken.objects.create(key="valid_key") 

def tearDown(self): 
    del self.ExpiringTokenAuth 
    del self.token 

def test_for_non_existent_token(self): 
    with self.assertRaises(exceptions.AuthenticationFailed) as ea: 
     self.ExpiringTokenAuth.authenticate_credentials('invalid_key') 

def test_for_user_inactive(self): 
    user = <UserModel>.objects.create(is_active=False, **params) # Create your own inactive user 
    self.token.user = user 
    self.token.save() 

    with self.assertRaises(exceptions.AuthenticationFailed) as ea: 
     self.ExpiringTokenAuth.authenticate_credentials('valid_key') 

def test_for_has_expired(self): 
    self.token.expired = True # Make the method has_expired return True 
    self.token.save() 

    with self.assertRaises(exceptions.AuthenticationFailed) as ea: 
     self.ExpiringTokenAuth.authenticate_credentials('valid_key') 
関連する問題