Модульное тестирование Python mixin, которое ссылается на функцию, определенную в другом месте - PullRequest
0 голосов
/ 09 апреля 2020

У меня следующая ситуация:

mixin_foo.py
   class Foo:
      def doFoo(self):
        bar=self.defined_elsewhere()
        #....do work

Модульный тест:

@patch('path_to_mixin_foo.mixin_foo.Foo.defined_elsewhere')
def test_do_foo(self, definedElsewhere)
    definedElsewhere.return_value = bar1
    self.FooTester.doFoo()

метод define_elsewhere () определен в классе, производном от этого миксина. Однако, в целях разработки, мы работаем над смешиванием_фу.Foo, прежде чем интегрировать его с классом. Однако, когда я пытаюсь выполнить модульное тестирование метода doFoo, pytest показывает следующую ошибку: Attributeerror <....> не имеет атрибута define_elsewhere. Правильный ли мой патч и есть ли другой способ юнит-тестирования этого метода? По сути, я хочу смоделировать значение call / return для self.defined_elsewhere, чтобы можно было протестировать метод doFoo.

1 Ответ

0 голосов
/ 09 апреля 2020

Проблема вашего подхода в том, что вы пытаетесь исправить несуществующее свойство. Вы не можете исправить defined_elsewhere, потому что он не определен в Foo, но вы можете извлечь из Foo, добавить метод и вместо этого исправить класс Foo:

class TestFoo(path_to_mixin_foo.Foo):
    def do_something(self):
        return bar1


@patch('path_to_mixin_foo.mixin_foo.Foo', TestFoo)
def test_do_foo(self)
    self.FooTester.doFoo()
...