Я использую 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. Не могли бы вы предложить способ включить предоставленный ответ в мой код?
пожалуйста исправить код: 1 отступа; 2 'check_password' vs' check_credential'; 3 'userid' и' password' не используются в вашем методе, это правильное поведение, которое вы проверили бы? Мы не можем писать тест, если не понимаем ожидаемого поведения. –
Извините, я их отредактировал. Идея заключается в том, что когда правильный клиентский пароль и пароль передаются клиенту Keystone, он возвращает keystone.auth_token. Это происходит в req.headers ['X-Auth-Token']. Было бы очень полезно, если бы кто-то мог объяснить, как я должен сделать это для этого подробнее .. – jaycee