2016-11-22 2 views
1

У меня есть здесь:издеваться функция атрибута питона

class Authentication(MethodView): 

    @staticmethod 
    def make_payload(identity): 
     iat = datetime.utcnow() 
     exp = iat + timedelta(seconds=300) 
     nbf = iat + timedelta(seconds=0) 
     identity = identity.key.urlsafe() 
     return {'exp': exp, 'iat': iat, 'nbf': nbf, 'identity': identity} 

, который основан на JWT. Я хочу, чтобы дразнить identity.key.urlsafe() вернуть 1, который является идентификатором пользователя:

def test_make_payload(self): 
    def get_urlsafe(): 
     return self.user_id 

    now = datetime.utcnow() 
    mock_identity = MagicMock() 
    mock_identity.key.return_value = MagicMock(urlsafe=get_urlsafe) 
    payload = Authentication.make_payload(mock_identity) 

Прямо сейчас, все работает, кроме моих издеваться. Цель состояла в том, чтобы он вернуться 1:

ipdb> payload 
{'identity': <MagicMock name='mock.key.urlsafe()' id='4392456656'>, 'iat': datetime.datetime(2016, 11, 22, 21, 34, 41, 605698), 'nbf': datetime.datetime(2016, 11, 22, 21, 34, 41, 605698), 'exp': datetime.datetime(2016, 11, 22, 21, 39, 41, 605698)} 
ipdb> payload['identity'] 
<MagicMock name='mock.key.urlsafe()' id='4392456656'> 

Как я могу издеваться этот вложенный вызов сделать urlsafe возврата 1 в моей издеваться? Спасибо

ответ

2

Она смотрит на меня, как вы хотите установить side_effect вашего издеваться быть get_urlsafe:

def test_make_payload(self): 
    def get_urlsafe(): 
     return self.user_id 

    now = datetime.utcnow() 
    mock_identity = MagicMock() 
    mock_identity.key.urlsafe.side_effect = get_urlsafe 
    payload = Authentication.make_payload(mock_identity) 

Из documentation:

side_effect: Функция, которая вызывается, когда Вызывается макет. См. Атрибут side_effect. Полезно для получения исключений или динамически меняющихся значений возврата. Функция вызывается с теми же аргументами, что и mock, и , если она не возвращает значение DEFAULT, возвращаемое значение этой функции используется как возвращаемое значение.

+2

@SvenMarnach - Спасибо. Ты прав. – mgilson

+0

отлично, спасибо mr gilson – codyc4321