【问题标题】:Python Mock - Mocking several openPython Mock - 模拟几个打开
【发布时间】:2012-03-10 02:02:10
【问题描述】:

读完后:How do I mock an open used in a with statement (using the Mock framework in Python)?

我可以使用以下方法在 python 中模拟 open 函数:

with patch(open_name, create=True) as mock_open:
    mock_open.return_value = MagicMock(spec=file)
    m_file = mock_open.return_value.__enter__.return_value
    m_file.read.return_value = 'text1'

    diffman = Diffman()
    diffman.diff(path1, path2)

当我测试的方法使用一个 open 语句时,它运行良好。这是我测试过的方法:

def diff(self, a, b):
    with open(a, 'r') as old:
        with open(b, 'r') as new:
            oldtext = old.read()
            newtext = new.read()

oldtext 和 newtext 的值是一样的(这里是'text1')。

我希望旧文本使用“text1”,新文本使用“text2”。

我该怎么做?

【问题讨论】:

    标签: python file-io mocking with-statement


    【解决方案1】:

    这是获得所需内容的快速方法。它有点作弊,因为被测方法中的两个文件对象是同一个对象,我们只是在每次读取后更改读取调用的返回值。如果您希望文件对象不同,您可以在多个层中使用相同的技术,但这会非常混乱,并且可能会不必要地掩饰测试的意图。

    替换这一行:

    m_file.read.return_value = 'text1'

    与:

    读取 = ['text1', 'text2'] m_file.read.side_effect = lambda: reads.pop(0)

    【讨论】:

      【解决方案2】:

      也许一个好的解决方案就是以一种更易于测试的方式编写代码。在 'diff' 的情况下,似乎很容易(诚然,没有太多其他上下文)让 diff 将已打开的文件对象作为参数。这可能是在代码中进行的一个相当小的更改,并且使测试变得非常容易,因为您可以在测试时轻松地向 diff() 提供模拟文件对象,而不是尝试跳过循环模拟相同的两个实例内置函数作为上下文管理器在......本身......或其他东西内调用;-)

      import StringIO
      
      diff(a, b):
        oldtext = a.read()
        newtext = b.read()
      
      def test_diff():
        a = StringIO.StringIO('text1')
        b = StringIO.StringIO('text2')
      
        res = diff(a, b)
        <some assertion here>
      

      这对您的情况有用吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 2015-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多