Прежде всего, вы можете и должны высмеивать xmlrpc.client.ServerProxy
; ваша библиотека импортирует xmlrpc.client
в качестве нового имени, но это все тот же объект модуля, поэтому оба объекта xmlrpclib.ServerProxy
в вашей библиотеке и xmlrpc.client.ServerProxy
ведут к тому же объекту.
Далее, посмотрите, как используется объект, и найдите звонки, синтаксис (..)
. Ваша библиотека использует прокси-сервер, как это:
# a call to create an instance
auth_server = xmlrpclib.ServerProxy(AuthURL)
# on the instance, a call to another method
valid = auth_server.isTokenValid(token)
Так что есть цепь здесь, где называется издеваться, а возвращаемое значение затем используется, чтобы найти другой атрибут, который также называется. Когда насмехается, вам нужно искать ту же цепочку; используйте для этого Mock.return_value
attribute. По умолчанию новый экземпляр mock возвращается, когда вы вызываете макет, но вы также можете установить тестовые значения.
Чтобы проверить свой код, вы хотите повлиять на то, что возвращает auth_server.isTokenValid(token)
, и проверить, правильно ли работает ваш код. Вы также можете утверждать, что правильный URL-адрес передается в экземпляр ServerProxy
.
Создайте отдельные тесты для разных результатов. Возможно, токен действителен в одном случае, не действителен в другом, и вы хотите проверить оба случая:
class Tester(unittest.TestCase):
@patch('xmlrpc.client.ServerProxy')
def test_valid_token(self, mock_serverproxy):
# the ServerProxy(AuthURL) return value
mock_auth_server = mock_serverproxy.return_value
# configure a response for a valid token
mock_auth_server.isTokenValid.return_value = 1
# now run your library code
return_value = library.Library().function()
# and make test assertions
# about the server proxy
mock_serverproxy.assert_called_with('some_url')
# and about the auth_server.isTokenValid call
mock_auth_server.isTokenValid.assert_called_once()
# and if the result of the function is expected
self.assertEqual(return_value, 'expected return value')
@patch('xmlrpc.client.ServerProxy')
def test_invalid_token(self, mock_serverproxy):
# the ServerProxy(AuthURL) return value
mock_auth_server = mock_serverproxy.return_value
# configure a response; now testing for an invalid token instead
mock_auth_server.isTokenValid.return_value = 0
# now run your library code
return_value = library.Library().function()
# and make test assertions
# about the server proxy
mock_serverproxy.assert_called_with('some_url')
# and about the auth_server.isTokenValid call
mock_auth_server.isTokenValid.assert_called_once()
# and if the result of the function is expected
self.assertEqual(return_value, 'expected return value')