Пересмешивание значений по умолчанию attr.ib () - PullRequest
0 голосов
/ 19 мая 2018

У меня есть ситуация, подобная следующей

@attrs(auto_attribs=True)
class ExampleClass:
  _prop: OtherClass = attrib(init=False, default=OtherClass())
  def some_func(self):
    test_var = OtherClass()
    test_var.some_func()
    self._prop.some_func()

class OtherClass:
  def some_func(self):
    raise NotImplementedException

def test_example(mocker):
  mocker.patch("path.to.example_class.OtherClass")
  sut = ExampleClass()
  sut.some_func()

Все классы и тесты находятся в разных файлах, и mocker - это приспособление, предоставленное pytest_mock, которое является просто оболочкой для unittest.mock, которая принимаетзаботиться об очистке проще.

Проблема, с которой я сталкиваюсь, заключается в том, что при запуске модульных тестов test_var правильно назначается как MagicMock из функции патча.Поэтому, когда test_var.some_func () возвращается, все в порядке.

Когда вызывается self._prop.some_func(), NotImplementedException повышается, так как кажется, что патч не влияет на это.

В моем модульном тесте я мог установить sut._prop = MagicMock(), но это внутренняя деталь реализации, делающая его хрупким.

Как можно избежать насмешек над переменной по умолчанию в attrib?

1 Ответ

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

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

@attrs(auto_attribs=True)
class ExampleClass:
  _prop: OtherClass = attrib(init=False, factory=lambda: OtherClass())
  def some_func(self):
    test_var = OtherClass()
    test_var.some_func()
    self._prop.some_func()
...