Задать вопрос
valerium
@valerium
Изобретая велосипед

Как в тесте проверить, что было обращение к свойству объекта?

Есть метод, который получает в качестве аргумента объект и обращается к некоторым свойствам (@property) этого объекта.
class Event:
    @property
    def number(self):
        return 123

def myFunction(event):
    return event.number * 10


Как написать тест, который проверит, было ли обращение?

Если бы это был просто метод, всё было бы элементарно. Достаточно создать вот такой класс:

class MockEvent:
    def __init__(self):
        self.number = Mock(return_value=10)


Экземпляр этого класса передать в качестве параметра и проверить, был ли вызван метод number. Но у меня не метод, а свойство, то есть оно не вызывается, его пытаются прочитать. Соответственно, магия моков не срабатывает. Я также пытался заменить моком методы __getattr__ и __getattribute__, но это не дало результата, обращение к произвольному атрибуту выдаёт AttributeError.

Можно, конечно, просто проверить результат, который возвращает метод, но я хочу быть уверен, что результат будет извлечён именно из этих свойств именно этого объекта. Или я не должен этого хотеть?
  • Вопрос задан
  • 347 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@neol
Для python 2:
def test_myFunction(self):
	mock_my = mock.MagicMock()
	mock_property = mock.PropertyMock(return_value=123)
	type(mock_my).number = mock_property
	myFunction(mock_my)
	mock_property.assert_called_with()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы