Python模仿模仿几开

2024-10-01 15:30:36 发布

您现在位置:Python中文网/ 问答频道 /正文

读完这篇文章后: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语句时,它工作得很好。以下是我的测试方法:

^{pr2}$

oldtext和newtext的值相同(这里是“text1”)。在

我想用‘text1’表示旧文本,用‘text2’表示新文本。在

我该怎么做?在


Tags: in文本anreturnvaluewithopenmock
2条回答

也许一个好的可能的解决方案就是用一种更好的方式编写代码,以便更容易地测试它。在“diff”的情况下,让diff take作为已经打开的文件对象的参数似乎很容易(承认没有太多其他上下文)。这很可能是代码中的一个相当小的更改,并且使测试变得非常容易,因为您可以在测试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>

这对你的案子有用吗?在

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

替换此行:

    m_file.read.return_value = 'text1'

有:

^{pr2}$

相关问题 更多 >

    热门问题