我需要测试一种打开两个文件并向每个文件写入不同数据的方法。文件的写入顺序无关紧要。
以下是我如何测试一种只需要打开一个文件的方法,使用Mock替换open
:
from io import BytesIO
import mock
class MemorisingBytesIO(BytesIO):
"""Like a BytesIO, but it remembers what its value was when it was closed."""
def close(self):
self.final_value = self.getvalue()
super(MemorisingBytesIO, self).close()
open_mock = mock.Mock()
open_mock.return_value = MemorisingBytesIO()
with mock.patch('__builtin__.open', open_mock):
write_to_the_file() # the function under test
open_mock.assert_called_once_with('the/file.name', 'wb')
assert open_mock.return_value.final_value == b'the data'
我无法修改此方法以使用写入两个文件的方法。我考虑过使用顺序side_effect
返回两个MemorisingBytesIO
s,并断言它们中的每一个都包含正确的数据,但是测试会很脆弱:如果方法中调用的顺序发生变化,测试就会失败。
所以我真正想做的是在用一个文件名调用它时open_mock
返回一个MemorisingBytesIO
,当它用另一个文件名调用时返回一个不同的。我已经在其他语言的模拟库中看到了这一点:在没有子类化的情况下是否可以在 Python 中使用Mock
?