如何处理特定条件并对其进行测试

时间:2021-03-08 19:29:38

标签: python unit-testing

我有以下代码。

MAXIMUM_DAYS = 7

def foo(start_date = None, end_date = None):


    if abs((parse(start_date) - parse(end_date)).days) > MAXIMUM_DAYS:
        return ?

如何编写函数以使其退出/错误并且我可以测试该行为?

我在单元测试中看到了 AssertRaises 方法。是否像创建自定义异常并在函数中引发它,然后在单元测试中对其进行测试一样简单?

如果是,是否有关于如何以及在何处编写异常的标准?

在文档或在线的某处是否有一个很好的例子?

谢谢,

肖恩

2 个答案:

答案 0 :(得分:1)

您走在正确的轨道上 - 使用异常是实现您的想法的常用技术。 assert 抛出异常,但它通常不用于生产代码,因为 assert 语句可以在命令行中禁用。相反,对于您的情况,提出 ValueError 断言将是一个不错的选择:

MAXIMUM_DAYS = 7

def foo(start_date = None, end_date = None):

    if abs((parse(start_date) - parse(end_date)).days) > MAXIMUM_DAYS:
        raise ValueError(f'Date range exceeds max: {MAXIMUM_DAYS}')

答案 1 :(得分:1)

警告...我的假设是,如果您的计算值大于 MAXIMUM_DAYS,您会问如何引发异常。基于这个假设,这是我的答案。

首先定义您的异常:

class GreaterThanMaximumDays(Exception):
  pass

然后只需在您的代码中

MAXIMUM_DAYS = 7

def foo(start_date = None, end_date = None):
  start_date_value = parse(start_date)
  end_date_value = parse(end_date)
  date_difference = abs(start_date_value - end_date_value)
  if date_difference > MAXIMUM_DAYS:
    raise GreaterThanMaximumDays()

  return date_difference

您关于它是否像使用 AssertRaises 一样简单和容易的猜测是正确的。

就我个人而言,我喜欢定义自己的异常,这样我就可以轻松地在异常处理中测试它的存在。我发现它使我的代码更易于阅读和理解我期望的有效内容。

<块引用>

我将解析后的值提取到它们自己的变量中。如果您出于任何原因需要检查返回值,这只会使调试更容易。