如何模拟具有设定大小的文件对象?
How do I mock a file object with a set size?
我有一个函数可以在文件太大 (> 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。我什至应该为此功能编写测试吗?我是一个没有太多经验的新开发人员。我想测试这个是不是太过分了?
如果你正在测试这个,你应该模拟 os.path.getsize
- 用 unittest.mock
模拟的文件对象提供了一个 read
方法,也许 write
, close
和其他文件对象特定函数 - 但此函数对文件系统上的实际文件进行系统 stat
调用:模拟文件对象不能在文件系统上 "seen"。
因此,要做的事情是改为相信 os.path.getsize
有效,并将其 return 值模拟为 "True" 和 "False" 以编写您想要的测试。
模拟函数本身更简单。
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"
模拟是你的朋友
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"))
我认为测试这样的功能是可以的。
我有一个函数可以在文件太大 (> 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。我什至应该为此功能编写测试吗?我是一个没有太多经验的新开发人员。我想测试这个是不是太过分了?
如果你正在测试这个,你应该模拟 os.path.getsize
- 用 unittest.mock
模拟的文件对象提供了一个 read
方法,也许 write
, close
和其他文件对象特定函数 - 但此函数对文件系统上的实际文件进行系统 stat
调用:模拟文件对象不能在文件系统上 "seen"。
因此,要做的事情是改为相信 os.path.getsize
有效,并将其 return 值模拟为 "True" 和 "False" 以编写您想要的测试。
模拟函数本身更简单。
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"
模拟是你的朋友
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"))
我认为测试这样的功能是可以的。