如何使用设置大小模拟文件对象?

时间:2016-02-06 20:39:54

标签: python unit-testing testing mocking

如果文件的大小太大(> 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。我是否应该为此功能编写测试?我是一个没有太多经验的新开发人员。我想要测试一下,我会过火吗?

3 个答案:

答案 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方法,可能是writeclose和其他文件对象特定的函数 - 但是这个函数使系统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"))

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