2017-01-04 3 views
9

Я участвую в процессе обучения модульному тестированию, однако я изо всех сил пытаюсь понять, как имитировать функции модульного тестирования. Я рассмотрел многие практические примеры и примеры, но концепция не переносит достаточно для меня, чтобы использовать ее в моем коде. Я надеюсь получить это, чтобы работать над фактическим примером кода, который мне поможет.mock xmlrpc.client method python

В этом случае я пытаюсь высмеять isTokenValid.

Вот пример кода того, что я хочу высмеять.

<in library file> 

import xmlrpc.client as xmlrpclib 

class Library(object): 
    def function: 
     #... 
     AuthURL = 'https://example.com/xmlrpc/Auth' 
     auth_server = xmlrpclib.ServerProxy(AuthURL) 
     socket.setdefaulttimeout(20) 
     try: 
      if pull == 0: 
       valid = auth_server.isTokenValid(token) 
     #... 

в тестовом файле единичном У меня есть

import library 

class Tester(unittest.TestCase): 
    @patch('library.xmlrpclib.ServerProxy') 
    def test_xmlrpclib(self, fake_xmlrpclib): 
     assert 'something' 

Как бы я издеваться код, указанный в «функции»? Знак может быть любое число в виде строки и действительным будет ИНТ (1)

ответ

1

Есть много mock attributes использовать, и вы можете изменить использование патч декоратора немного следующим образом:

class Tester(unittest.TestCase): 
    def test_xmlrpclib(self): 
     with patch('library.xmlrpclib.ServerProxy.isTokenValid') as isTokenValid: 
      self.assertEqual(isTokenValid.call_count, 0) 
      # your test code calling xmlrpclib 
      self.assertEqual(isTokenValid.call_count, 1) 
      token = isTokenValid.call_args[0] # assume this token is valid 
      self.assertEqual(isTokenValid.return_value, 1) 

Вы можете скорректируйте приведенный выше код, чтобы удовлетворить ваши требования.

4

Прежде всего, вы можете и должны высмеивать 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') 
Смежные вопросы