【问题标题】:Unit Test exception block of simple python function简单python函数的单元测试异常块
【发布时间】:2022-01-14 20:38:40
【问题描述】:

我正在尝试测试一个简单的python函数的异常块,如下所示

function_list.py

def option_check():
"""
Function to pick and return an option
"""
try:
    # DELETE_FILES_ON_SUCCESS is a config value from constants class. Valid values True/False (boolean)
    flag = Constants.DELETE_FILES_ON_SUCCESS
    if flag:
        return "remove_source_file"
    else:
        return "keep_source_file"

except Exception as error:
    error_message = F"task option_check failed with below error {str(error)}"
    raise Exception(f"Error occured: {error}") from error

如何强制和异常对异常块进行单元测试?请注意,我在异常块中的内容是我实际拥有的内容的简化版本。我正在寻找的是一种使用单元测试来测试异常场景来强制异常的方法。 Python版本是3.6

【问题讨论】:

  • 我注意到您已将问题标记为“嘲笑”。如果您熟悉 Python 的模拟库,您可以模拟出由您的 try 块调用的函数并让它引发异常。您的 try 块实际上是否如此小以至于不调用任何其他函数?如果是这样,它也可能不会引发任何异常。
  • try 块与此处显示的完全相同。问题是这里检查的值(DELETE_FILES_ON_SUCCESS)来自配置,并且该值可能无效导致异常,这是我在这里尝试测试的,如果无效值导致异常。
  • 我明白了。如何模拟这个似乎已经有了一个很好的答案,但我的直觉是这不应该需要处理异常。我不知道您的全部情况,但总的来说,我不希望访问常量会导致异常。每当需要常量时,是否在整个程序中都有错误处理?也许可以在程序启动时加载并验证配置文件,或者可以防止无效值首先进入配置文件?

标签: python unit-testing exception mocking assert


【解决方案1】:

您可以修补 Constants 类并删除您从模拟中访问的属性。

from unittest import mock

# replace __main__ with the package Constants is from
with mock.patch("__main__.Constants") as mock_constants:
    del mock_constants.DELETE_FILES_ON_SUCCESS
    option_check()

当option_check() 尝试访问Constants.DELETE_FILES_ON_SUCCESS 时,它会引发AttributeError,让您可以访问except 块。

【讨论】:

    猜你喜欢
    • 2013-02-21
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多