如果文件的大小太大(> 1MB),我有一个引发异常的函数。我想在不使用真实图像的情况下测试此功能。我知道用mock_open模拟文件对象是可能的,但是如何给这个假文件一个大小?
这是我要测试的功能:
def _check_image_size(img_path):
megabyte = 1048576
if os.path.getsize(img_path) > megabyte:
raise ValueError("Image must be less than or equal to 1MB in size.")
所以只是以不同的方式重申这个问题:如何在不使用大于1MB的真实文件的情况下测试此功能?
P.S。我是否应该为此功能编写测试?我是一个没有太多经验的新开发人员。我想要测试一下,我会过火吗?
答案 0 :(得分:2)
模拟函数本身更简单。
with mock.patch('os.path.getsize', return_value=2*1024*1024)
try:
_check_image_size("any arbitrary string")
except ValueError:
print "Successfully raised ValueError"
else:
print "Did not raise ValueError"
或者,不使用mock
库(或类似的东西),猴子直接修补函数。
import os.path
os.path.getsize = lambda path: return 2*1024*1024
try:
_check_image_size("any arbitrary string")
except ValueError:
print "Successfully raised ValueError"
else:
print "Did not raise ValueError"
答案 1 :(得分:0)
如果您正在对此进行测试,则应该模拟os.path.getsize
- 使用unittest.mock
模拟的文件对象提供read
方法,可能是write
,close
和其他文件对象特定的函数 - 但是这个函数使系统stat
调用文件系统上的实际文件:模拟的文件对象不能被看到""在文件系统上。
所以,要做的是信任os.path.getsize
,并将其返回值模拟为" True"和"错误"写下你想要的测试。
答案 2 :(得分:0)
mock是你的朋友
import unittest
from unittest.mock import patch
import os
def _check_image_size(img_path):
megabyte = 1048576
if os.path.getsize(img_path) > megabyte:
raise ValueError("Image must be less than or equal to 1MB in size.")
class Test(unittest.TestCase):
@patch("os.path.getsize")
def test_getsize(self, getsize):
getsize.return_value = 1024 ** 2 + 4
self.assertRaises(ValueError,lambda: _check_image_size("some path to a big* file"))
我认为可以测试像这样的功能。