Python макет метода, когда конкретный аргумент - PullRequest
0 голосов
/ 23 октября 2019

У меня есть метод python, такой как

import external_object

from external_lib1 import ExternalClass1
from external_lib2 import Hook

class MyClass(self):

    def my_method(self):
        ExternalClass.get('arg1') #should be mocked and return a specific value with this arg1
        ExternalClass.get('arg2') #should be mocked and return a specific value with this arg2

    def get_hook(self):
        return Hook() # return a mock object with mocked method on it

    def my_method(self):
        object_1 = external_object.instance_type_1('args') # those are two different object instanciate from the same lib.
        object_2 = external_object.instance_type_2('args')

        object_1.method_1('arg') # should return what I want when object_1 mocked
        object_2.method_2 ('arg') # should return what I want when object_2 mocked

В моем тесте я хотел бы понять, что я помещаю в комментарии.

Я мог бы сделать это, но каждый раз, когда он получаетдействительно грязныйЯ использую для вызова flexmock некоторые вещи (например, ExternalClass.get ('arg1') будет издеваться над flexmock(ExternalClass).should_return('arg').with_args('arg') # etc...), но мне надоело использовать разные тестовые библиотеки для насмешки.

Я бы хотелиспользовать только фиктивную библиотеку, но я изо всех сил пытаюсь найти последовательный способ сделать это.

1 Ответ

0 голосов
/ 23 октября 2019

Мне нравится использовать Python's unittest lib. Конкретно unittest.mock, который является отличной библиотекой для настройки побочных эффектов и возвращаемого значения в функциях, проверенных модулем.

Их можно использовать следующим образом:

class Some(object):
  """
    You want to test this class
    external_lib is an external component we cannot test
  """
  def __init__(self, external_lib):
    self.lib = external_lib

  def create_index(self, unique_index):
    """
      Create an index.
    """
    try:
      self.lib.create(index=unique_index) # mock this
      return True
    except MyException as e:
      self.logger.error(e.__dict__, color="red")
      return False

class MockLib():
   pass

class TestSome(unittest.TestCase):
  def setUp(self):
    self.lib = MockLib()
    self.some = Some(self.lib)

  def test_create_index(self):
    # This will test the method returns True if everything went fine

    self.some.create_index = MagicMock(return_value={})
    self.assertTrue(self.some.create_index("test-index"))

  def test_create_index_fail(self):
    # This will test the exception is handled and return False

    self.some.create_index = MagicMock(side_effect=MyException("error create"))
    self.assertFalse(self.some.create_index("test-index"))

Поместите файл класса TestSome() где-то вроде your-codebase-path/tests и запустите:

python -m unittest -v

Надеюсь, это полезно.

...