2015-03-09 5 views
0

Я использую keystoneclient в своем модуле, чтобы получить auth_token, когда передается учетная запись пользователя. Затем поместите токен в req.headers ['X-Auth-Token'], как показано ниже. Я хочу написать unittest для этого класса. Я предполагаю, что мне нужно издеваться над частью аутентификации Keystone. Я новичок в unittesting и mock, поэтому, пожалуйста, помогите мне понять, как я должен подходить к этому.Mock external REST in Python unittest

from keystoneclient.v3 import client 
from keystoneclient import exceptions as keystone_exceptions 

class TokenChecker(wsgi.Middleware): 

    def myrequest(self,req): 
     try: 
      token = self.check_credential(userid,password) 
     except HTTPUnauthorized as e: 
      return e 

     req.headers['X-Auth-Token'] = token 

    def check_credential(self, userid, password): 
     keystone = client.Client(
      username   = foo 
      password   = foo2 
      user_domain_name = foo3 
      domain_name   = foo4 
      auth_url   = foo5 
      endpoint   = foo6 
     ) 

     try: 
      keystone.authenticate() 
      return keystone.auth_token 
     except (keystone_exceptions.AuthorizationFailure, 
       keystone_exceptions.Unauthorized) as e: 

      raise HTTPUnauthorized(e) 

UnitTest я создал на основе этого ответа я был предоставлен,

@mock.patch.object(TokenChecker, 'check_password', return_value= 'testtoken') 
    def test_with_valid_auth_header(self,check_password_mock): 
     req = webob.Request.blank('/') 
     checker = TokenChecker(req) 
     checker.process_request(req) 
     self.assertNotEqual(req.headers['X-Auth-Token'], 1) 

Я думаю, что это несколько написано неправильно .. но я не могу точно сказать. Это бросает мне KeyError на X-Auth-Token. Не могли бы вы предложить способ включить предоставленный ответ в мой код?

+0

пожалуйста исправить код: 1 отступа; 2 'check_password' vs' check_credential'; 3 'userid' и' password' не используются в вашем методе, это правильное поведение, которое вы проверили бы? Мы не можем писать тест, если не понимаем ожидаемого поведения. –

+0

Извините, я их отредактировал. Идея заключается в том, что когда правильный клиентский пароль и пароль передаются клиенту Keystone, он возвращает keystone.auth_token. Это происходит в req.headers ['X-Auth-Token']. Было бы очень полезно, если бы кто-то мог объяснить, как я должен сделать это для этого подробнее .. – jaycee

ответ

1

Вы написали 2 метода, поэтому вам нужно хотя бы написать не менее 2 единичных тестов. У вас также есть блоки try-except, что означает дополнительный тест для каждого исключения, поэтому в целом 5 модульных тестов. я бы издеваться check_credential в myrequest модульных тестов:

@mock.patch.object(TokenChecker, 'check_credential', return_value=1) 
def test_myrequest_token_is_set(check_credential_mock): 
    checker = TokenChecker() 
    checker.myrequest(request) 
    assert request.headers['X-Auth-Token'] == 1 


@mock.patch.object(TokenChecker, 'check_credential') 
def test_myrequest_is_unauthorized(check_credential_mock): 
    check_credential_mock.side_effect = [HTTPUnauthorized] 
    checker = TokenChecker() 
    assert type(checker.myrequest(request)) == HTTPUnauthorized 

и имитировали Client и вызывает к нему во 2-й метод.
Посмотрите here, чтобы узнать, как издеваются класс или вы можете также использовать mock.create_autospec(Client) (docs)

+0

Пожалуйста, разместите ссылку на ваш точный код, это действительно сложно угадать, что вы делаете. – matino

Смежные вопросы