2017-06-20 22 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') 

單元測試:

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

我得到現在這個錯誤: '導入錯誤:沒有模塊名爲apps.authentication.authentication.ExpiringTokenAuthentication ' – fatah

+0

試試這個第一補丁@patch('apps.authentication.authentication.ExpiringTokenAuthentication .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')