Новичок в модульном тестировании и Python в целом, наткнулся на пример во вводном руководстве по модульному тестированию, в котором оператор with используется для обнаружения ошибки ValueError.
Тестируемый скрипт (invoice_calculator.py):
def divide_pay(amount, staff_hours):
"""
Divide an invoice evenly amongst staff depending on how many hours they
worked on a project
"""
total_hours = 0
for person in staff_hours:
total_hours += staff_hours[person]
if total_hours == 0:
raise ValueError("No hours entered")
per_hour = amount / total_hours
staff_pay = {}
for person in staff_hours:
pay = staff_hours[person] * per_hour
staff_pay[person] = pay
return staff_pay
Модульный тест включает эту функцию, чтобы поймать крайний случай, когда staff_hours = None
:
import unittest
from invoice_calculator import divide_pay
class InvoiceCalculatorTests(unittest.TestCase):
def test_equality(self):
pay = divide_pay(300.0, {"Alice": 3.0, "Bob": 6.0, "Carol": 0.0})
self.assertEqual(pay, {'Bob': 75.0, 'Alice': 75.0, 'Carol': 150.0})
def test_zero_hours_total(self):
with self.assertRaises(ValueError):
pay = divide_pay(360.0, {"Alice": 0.0, "Bob": 0.0, "Carol": 0.0})
if __name__ == "__main__":
unittest.main()
Что касается использования оператора with
в test_zero_hours_total(self)
, что на самом деле здесь происходит с точки зрения того, как этот оператор работает/выполняется?
Работает ли функция test_zero_hours_total()
в основном следующим образом (описание неспециалиста): ожидаемая ошибка должна быть ValueError
(что мы делаем, передавая ValueError
функции assertRaises()
), когда 360.0, {"Alice": 0.0, "Bob": 0.0, "Carol": 0.0}
(что вызовет ValueError
в divide_pay()
) передается в качестве аргументов функции divide_pay()
функция?