我正在为我的脚本中的函数编写单元测试,但是我在创建模拟文件时遇到了问题。 我的函数接受一个文件名并输出它的md5值。
def md5(file_name):
#Function to return the md5 value of a file
hash_md5 = hashlib.md5()
with open(fname, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
我目前的单位测试:
import mock
class Function_to_test_TestCase(unittest.TestCase):
def test_filename(self):
with mock.patch('__main__.open', mock.mock_open(read_data=''), create=True) as m:
md5_value=my_script.function_to_get_md5_value(m)
然而我收到错误:
with open(fname, "rb") as f:
TypeError: coercing to Unicode: need string or buffer, MagicMock found
这是使用相关模拟md5值制作模拟文件的正确方法吗? 任何建议表示赞赏!
答案 0 :(得分:1)
可能你应该将read_data指定为二进制文件? 这是一个工作示例,您可以将其粘贴到文件并使用unittest运行:
import hashlib
from unittest import TestCase
import mock
def md5(file_name):
hash_md5 = hashlib.md5()
with open(file_name, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
class MD5TestCase(TestCase):
def test(self):
with mock.patch('%s.open' % __name__, mock.mock_open(read_data=b'aaa'), create=True) as m:
result = md5("lalala")
self.assertEqual(result, '47bce5c74f589f4867dbd57e9ca9f808')
答案基于答案:How do I mock an open used in a with statement (using the Mock framework in Python)?