Ведущий-первый юнит-тест с несколькими утверждениями
Я пытаюсь использовать подход 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
появляется из ниоткуда тоже.