Python - макет и модульное тестирование цепочки методов, которые изменяют список ввода - PullRequest
0 голосов
/ 04 июня 2019

У меня есть список фильтров, и каждый фильтр меняет список ввода. Как создать макет для каждого фильтра, который изменит список ввода?

class TwoFilter(object):

    def filter(self, arr):
        arr[:] = [i for i in arr if i % 2 != 0]

class ThreeFilter(object):

    def filter(self, arr):
        arr[:] = [i for i in arr if i % 3 != 0]

class FourFilter(object):

    def filter(self, arr):
        arr[:] = [i for i in arr if i % 3 != 0]

class MyFilters(object):

    def __init__(self):
        self.filters = [TwoFilter(), ThreeFilter(), FourFilter()]

    def apply_filters(self, arr):
        for f in self.filters:
            f.filter(arr)

Я хочу провести модульное тестирование apply_filters, насмехаясь над фильтрами в self.filters для входа [1,2,3,4]. Есть ли способ заставить каждый макет изменить вход arr и проверить, был ли вызван каждый последующий фильтр с этим измененным arr?

P.S .: Я могу обойти эту проблему, когда фильтры возвращают arr и используют mock.return_value, чтобы изменить вывод макета.

1 Ответ

0 голосов
/ 05 июня 2019

Поскольку вы говорили о насмешке над классами фильтров, я полагаю, что вы подходите к тому, чтобы также тестировать классы фильтров по отдельности? Это, безусловно, должно быть сделано, и лучше сделать это в качестве первого шага - если я не ошибаюсь, читая ваш код, вы, скорее всего, обнаружите ошибку.

Относительно теста apply_filters: Почему вы вообще хотите издеваться над классами фильтров? Кажется, нет никакого оправдания - вы можете просто вызвать apply_filters с некоторыми подходящими значениями для arr, чтобы увидеть, действительно ли другие фильтры вызываются. И, может быть, вы найдете следующую ошибку (после исправления первой) - просто попробуйте найти тестовый пример, который не проходит, если третий фильтр не вызывается.

Насмешка должна выполняться по причине - взгляните на Когда использовать фиктивные объекты в модульных тестах .

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