Python unittest mock: можно ли смоделировать значение аргументов по умолчанию __init __ во время теста? - PullRequest
0 голосов
/ 29 мая 2018

Я хочу проверить класс, созданный с параметрами по умолчанию, заменив значение параметра по умолчанию во время модульного тестирования.

Например, я хочу следующую строку (по всему коду) obj = SomeClass()

Чтобы он выглядел так, как будто его вызывали с параметром

obj = SomeClass(overiden_parameter)

Одним из решений может быть создание простого подкласса:

`` `def OriginalClass (object):

def __init_(some_param="default_value"):
    ...

`` `

` `` def MockedOriginalClass (OriginalClass):

def __init_():
    super(MockedOriginalClass, self).__init__("some_other_value)
    ...

`` `

Как издеваться/ patch OriginalClass будет MockedOriginalClass без кода?Имейте в виду, что я хочу сохранить функциональность исходного класса, единственное, что я хочу изменить, - это параметр по умолчанию __init__.

Я чувствую, что это очень просто сделать с помощью Mocking,Я просто не совсем понял, как это сделать.

Я узнал об этом вопросе: Python unittest mock: возможно ли смоделировать значение аргументов метода по умолчанию во время теста?

Это очень близко, но я не думаю, что тот же трюк можно применить к методу __init__.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Посмотрите на комментарий @Martinj Pieters, но, в качестве альтернативы, вы можете использовать патч обезьяны https://en.wikipedia.org/wiki/Monkey_patch, который поддерживается в pytest https://docs.pytest.org/en/documentation-restructure/how-to/monkeypatch.html, чтобы переопределить метод __init__.

0 голосов
/ 29 мая 2018

Один из способов сделать это - смоделировать весь класс для конкретных тестов, подобных этому:

Пример: у меня есть класс SomeClass, который я хочу смоделировать.Мой псевдоним называется MockSomeClass, который будет имитировать класс SomeClass.

class MockSomeClass(SomeClass):
    '''
    Mock Class
    '''
    def __init__(overiden_parameter):
        self.overiden_parameter = overiden_parameter

Так что во время теста вы будете использовать класс mock, который имеет переопределенную функциональность, и в то время как поведение других функций останется таким же (наследование).

Patching

mock_some_class_obj = MockSomeClass()

@mock.patch('SomeClass', return_value=mock_some_class_obj)
def test1(self, mock_some_class_obj):
'''
Test 1
'''
    obj = SomeClass()

catch , поэтому в коде всякий раз, когда вы будете создавать объект SomeClass, будет возвращаться объект класса mock.в классе макет, вы можете добавить свои собственные функции.

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