Python - расширение клиентского класса API или передача экземпляра - PullRequest
2 голосов
/ 05 августа 2011

Я взаимодействую с API, для которого у меня есть библиотека Python.Библиотека предоставляет класс APIClient, который предоставляет все функциональные возможности API.Я хочу взаимодействовать с этим API в соответствии с некоторой логикой, и я хотел бы иметь возможность протестировать логику wihtout , выполняющую вызовы API (т. Е. Макет), поскольку он является транзакционным.

Ясно, что мне нужно (на каком-то этапе) макетировать некоторые функции API-клиента, но я не уверен, как лучше это сделать.

Должен ли я просто расширить APIClientкласс, реализовать мою логику, а затем снова расширить мой класс, чтобы создать фиктивную версию:

class MyClass(APIClient):
   pass #Lots of interesting things actually happen here

class MyTestClass(MyClass):

   def an_overridden_method(self):
      pass #here I implement a method for testing

Или я должен передать экземпляр APIClient своему классу и, когда я хочу проверить, я должен пройти вмакетная версия класса APIClient?

class MyClass(object):

   def __init__(self, api_client):
      self.api_client = api_client

class MockAPIClient(APIClient):

   def an_overwritten_method(self):
      pass

Или есть ли для меня способ «наилучшей практики» для реализации этого?

Ответы [ 2 ]

0 голосов
/ 05 августа 2011

+ 1 для передачи в api_client экземпляр; держит мысли слабо связаны.

Кроме того, в зависимости от класса APIClient я бы создал совершенно новый класс, не наследуя от исходного APIClient.

0 голосов
/ 05 августа 2011

Обычно вы не будете высмеивать части тестируемого устройства. Если вы тестируете MyClass, одна из вещей, которую вы хотели бы протестировать, - это то, что он создает и выполняет транзакции, когда он действительно должен это делать. В вашем примере переопределенный метод не будет проверен.

Вместо этого вы должны смоделировать слой, который фактически вызовет транзакции; организуйте, чтобы SomeDatabaseApi.connect, SomeDatabaseApi.Connection.startTransaction и так далее были фиктивными заглушками, чтобы тестируемый модуль все еще вызывал их, но затем вы сможете увидеть, как они были вызваны впоследствии.

Вероятно, существует еще больше фальшивых сред тестирования для python, чем вам может понадобиться, но я хорошо использовал MiniMock , это просто, эффективно и выразительно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...