如何模拟具有设定大小的文件对象?

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"))

我认为测试这样的功能是可以的。