Ведущий-первый юнит-тест с несколькими утверждениями

Я пытаюсь использовать подход Presenter-First к новому проекту. Я нахожусь с unittest ниже. Использую ли я плохие практики модульного тестирования, включив в этот тест так много утверждений? Если да, то связана ли проблема с моим подходом к тестированию или реализацией Presenter.setOverview? Другими словами, должен ли метод setOverview вызывать self.setSalesQty, а не self.view.setSalesQty? В этом случае у меня будет отдельный тест для Presenter.setSalesQty, и тесту testSetOverview больше не нужно будет беспокоиться о проверке этого.

def testSetOverview(self):
    # set up mock objects
    p = PropertyMock()
    type(self.mock_model).descriptions = p
    self.mock_model.getData.side_effect = [5, 10]
    self.mock_model.getDescription.side_effect = 'Description'

    # get required variables
    end = dt.date.today()
    start = dt.date(year=end.year, month=1, day=1)
    pn = 'abcd'

    # call presenter method
    self.presenter.setOverview(pn)

    # test to make sure proper calls were made
    model_getData_calls = [call(pn=pn, start=start, end=end,
                       data=self.mock_model.SHIPPED_QUANTITY),
                   call(pn=pn, start=start, end=end,
                        data=self.mock_model.PRICE_PAID)]

    self.mock_model.getData.assert_has_calls(model_getData_calls, any_order=True)
    assert self.mock_model.getDescription.called

    self.mock_view.setSalesQty.assert_called_with(val=5)
    self.mock_view.setSalesDols.assert_called_with(val=10)
    self.mock_view.setDescription.assert_called_with(val='Description')

1 ответ

Решение

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

Чтобы сделать пример, у вас есть две функции ниже list_counter зависит от word_count, Так что при тестировании list_counter Вы можете сделать два утверждения, чтобы убедиться, что два компонента в list_counter верно. Но, наверное, было бы разумнее проверить word_count по отдельности.

def word_count(word):
    return len(word)

def list_counter(listing=None):
    total = 0
    for l in listing:
        total += word_count(l)

    return (len(listing), total)

Трудно более подробно прокомментировать ваш случай, так как у меня нет доступа к тому, как выглядит модель. self.mock_view появляется из ниоткуда тоже.

Другие вопросы по тегам