1

我有一个用例,我有一堆文件需要按顺序连接,在连接到输出后删除每个文件。代码看起来像这样:

def compile(self):
    with open("output.file", "wb") as outfile:
        for part in sorted(self.parts):
            with open(part, "rb") as infile:
                for line in infile:
                    outfile.write(line)

            os.remove(part)

    # do other logic ...

我很难想出一种正确测试此代码的方法。我想确定:

  1. 零件按排序顺序排序和循环。
  2. 每个输入文件被逐行读取并写入输出文件。
  3. 每个输入文件在用尽后​​被删除。

我的主要困难是模拟文件对象。我正在使用 Python 的mock库,但我不确定在哪里修补以及如何完成它。如何修补文件对象以确保所有内容都正确写入?

4

1 回答 1

1

您真的不想测试 'open'、'os.remove'、'sorted' 是否真的有效,可以安全地假设,因为它们是 python 标准库的一部分,所以它们已经在其他地方进行了大量测试。您真正想要的只是测试它们是否真正被调用,因此您可以简单地在测试代码中模拟这些调用并测试它们是否真的被您期望的 args 调用。

测试可能类似于

@mock.patch.object(os, 'remove')
@mock.patch('%s.sorted' % __name__, create=True)
@mock.patch('%s.open' % __name__, create=True)
def test_compile(mock_open, mock_sort, mock_os_remove):
    mock_sort.return_value = ['parts']
    compile()
    mock_open.assert_any_call('output.file', 'wb')
    mock_sorted.assert_called_with(['parts'])
    mock_os_remove.assert_called_with('parts','rb')

显然,这必须进行一些调整,因为 compile() 似乎是一个方法而不是一个独立的函数,但是函数的补丁和一般方法应该是相同的。

于 2013-11-14T21:41:42.927 回答