【问题标题】:How can I use mock to return None for parse known args?如何使用模拟返回 None 以解析已知参数?
【发布时间】:2019-08-11 18:56:02
【问题描述】:

下面我有一个函数,它根据命令行输入返回两个日期。如何使用 mock 来制作它,以便我可以对 else 语句执行单元测试?

# time from of pull
def time_frame():
    """
    checks for optional user input for start and end date of data pull
    creates start and end date for query
    :return: start and end date
    """
    # get the dates
    args, leftovers = get_the_args()

    if args.start_dt is not None and args.end_dt is not None:

        return args.start_dt, args.end_dt

    else:

        # get today
        the_today_start_date, the_today_end_date = get_dates_from_today()

        return the_today_start_date, the_today_end_date

我尝试过使用mock_get_the_args.return_value = mock.Mock(return_value=None), mock.Mock() 使其在单元测试的这一部分运行时get_the_args() 函数的args 输出返回None?我需要什么来更改代表args 变量的 mock.Mock() 才能正常工作?

以下是目前的单元测试:

# the time frame
@mock.patch('src.toolkit.get_dates_from_today')
@mock.patch('src.toolkit.get_the_args')
def test_time_frame(mock_get_the_args, mock_get_dates_from_today):
    # set some dates
    start_date = '2019-01-01'
    end_date = '2019-01-01'
    # mocking
    mock_get_the_args.return_value = mock.Mock(), mock.Mock()
    mock_get_dates_from_today.return_value = mock.Mock(), mock.Mock()

    start_date, end_date = time_frame() 
    mock_get_the_args.assert_called_once()

    mock_get_the_args.return_value = mock.Mock(return_value=None), mock.Mock()
    start_date, end_date = time_frame() 
    mock_get_dates_from_today.assert_called_once()

【问题讨论】:

    标签: python-3.x unit-testing mocking argparse python-unittest


    【解决方案1】:

    使用argparse 代码进行单元测试有点棘手,因为它通常需要来自命令行的输入。但测试本身使用命令行(可能使用自己的 argparse 解析器)。

    我假设get_the_args 设置了一个解析器,并返回parser.parse_known_args()

    出于测试目的,您可以方便地选择提供明确的argv 列表。

    例如:

    def time_frame(argv=None):
        """
        checks for optional user input for start and end date of data pull
        creates start and end date for query
        :return: start and end date
        """
        # get the dates
        args, leftovers = get_the_args(argv)
        ...
    

    其中get_the_args 使用parse_known_args(argv)

    如果argv 为无,那么它会解析常规命令行。但是您可以提供生成所需argsextras 的任何字符串列表。实际上,您可以模拟命令行。

    另一个选项是定义一个args 命名空间对象,例如。 args = argparse.Namespace(start_dt=None, end_dt='foobar')。然后你可以像以前一样使用args.start_dt

    使测试更容易的另一件事是使parser 仅在代码作为脚本运行时运行,而不是在导入时运行。即放在`if name =='ma​​in': 块中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-21
      • 2022-01-11
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      相关资源
      最近更新 更多