【发布时间】:2016-02-12 13:05:05
【问题描述】:
我试图模拟在我的类的方法中使用的 open 函数。 我找到了这个线程How do I mock an open used in a with statement (using the Mock framework in Python)?,但无法解决我的问题。此外,unittest 文档显示了一个解决方案,它也没有模拟我打开的https://docs.python.org/3/library/unittest.mock-examples.html#patch-decorators
这是我的类,其中使用了open函数的方法:
#__init.py__
import json
class MyClass:
def save_data_to_file(self, data):
with open('/tmp/data.json', 'w') as file:
json.dump(data, file)
...
mc = MyClass()
现在我找到了一些不同的解决方案。这是我的测试:
#save_to_file_test.py
from mymodule import MyClass
from mock import mock_open, patch
import ast
class SaveToFileTest(unittest.TestCase):
def setUp(self):
self.mc = MyClass()
self.data = [
{'id': 5414470, 'name': 'peter'},
{'id': 5414472, 'name': 'tom'},
{'id': 5414232, 'name': 'pit'},
]
def test_save_data_to_file(self):
m = mock_open()
with patch('mymodule.open', m, create=True):
self.mc.save_data_to_file(self.data)
string = ''
for call in m.return_value.write.mock_calls:
string += (call[1][0])
list = ast.literal_eval(string)
assertEquals = (list, self.data)
我不确定这是否是测试应写入文件的内容的最佳方法。 当我测试 mock_calls(call_args_list 相同)时,这是传递给文件句柄的参数。 欢迎任何意见、改进和建议。
【问题讨论】:
标签: python unit-testing mocking