2016-02-06 3 views
0

У меня есть функция, которая вызывает исключение, если размер файла слишком большой (> 1 МБ). Я бы хотел проверить эту функцию без использования реального изображения. Я знаю, что можно издеваться над файловыми объектами с помощью 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.") 

Так просто повторить вопрос по-другому: как я проверить эту функцию без использования реального файла больше 1 МБ?

P.S. Должен ли я даже написать тест для этой функции? Я очень новый разработчик, у которого нет большого опыта. Я иду за борт, желая проверить это?

+0

Около двух экземпляров, но по крайней мере применимо: http://stackoverflow.com/questions/19672138/how-do-i-mock-the-filesystem-in-python-unit-tests. Это покрывает большую часть того, что есть (и что я считаю добавлением) своим ответом. – chepner

ответ

1

Проще всего издеваться над самой функцией.

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" 
+0

Спасибо. Я знал, что должен что-то издеваться, но я искал не то, что насмехалось. Издевательство над os.path.getsize отлично работало. –

0

Если вы тестируете это, вы должны издеваться os.path.getsize вместо этого - объект файла издевался с unittest.mock обеспечивает read метод, может быть write, close и другими объекты файла специфических функций - но эта функция делает системный stat вызов фактический файл в файловой системе: издевательский файловый объект не может быть «замечен» в файловой системе.

Итак, дело в том, чтобы доверять os.path.getsize работает и издевается над его значениями «True» и «False», чтобы написать те тесты, которые вы хотите.

0

издеваться ваш друг

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

Я думаю, что его OK, чтобы проверить функцию, как этот.

Смежные вопросы