【问题标题】:How to mock a list in Python?如何在 Python 中模拟列表?
【发布时间】:2017-11-01 07:17:47
【问题描述】:

例如,我有一些代码试图访问一个列表:

def some_code():
    script_dir = os.path.dirname(sys.argv[0])

我需要模拟sys.argv[0]。所以我将@patch.object 添加到我的测试中:

import os
import sys

THIS_DIR = os.path.dirname(os.path.abspath(__file__))
@mock.patch.object(sys, 'argv', mock.Mock(return_value=[THIS_DIR]))
def test_mytest():
    some_code()

但这不起作用。 Pytest 报错:

>     script_dir = os.path.dirname(sys.argv[0])
E     TypeError: 'Mock' object does not support indexing

我做错了什么?

【问题讨论】:

    标签: python unit-testing mocking pytest python-mock


    【解决方案1】:

    不要使用Mock 对象替换列表,只需将sys.argv 替换为不同的列表即可。您仍然可以使用mock.patch 来管理替换和撤消:

    @mock.patch.object(sys, 'argv', [THIS_DIR])
    

    请注意,您可能希望传入文件名,而不是目录(除非您的测试目录嵌套在您要使用的实际目录下)。

    您的模拟配置将sys.argv 替换为可调用对象,因此只有sys.argv() 会生成您的[THIS_DIR] 列表。

    演示:

    >>> import sys
    >>> from unittest import mock
    >>> sys.argv
    ['']
    >>> with mock.patch.object(sys, 'argv', ['foo', 'bar', 'baz']):
    ...     sys.argv
    ...
    ['foo', 'bar', 'baz']
    >>> sys.argv
    ['']
    

    【讨论】:

    • 感谢 Martijn,“@mock.patch.object(sys, 'argv', [THIS_DIR])" 版本有效!
    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多