Makondo
Makondo

Reputation: 353

In python's unittest, how do I mock a fake folder with fake images inside?

I am trying to create a unit test for a function that reads every image from a folder and saves them in a list.

Here is a simplified version of the function:

def read_images(directory):

    image_paths = os.listdir(directory)

    images = []
    for im in image_paths:
        images.append(cv2.imread(os.path.join(directory, im)))

    return images

This other question brought me close to the solution, but in my case I want the fake files created to be images (basically, arrays) so I can read them with cv2.imread.

My idea is not having to create any temporary folder and, of course, not having to connect with any external folder or database. Is this possible?

Edit: to be clear, I'd like to not have to create temporary folders, nor temporary image files. I'd like to know if there is a way of telling the program: "There is a folder here, and inside it there are some images/arrays with this shape", but with actually not having to create anything in memory.

Upvotes: 2

Views: 2758

Answers (2)

Gang
Gang

Reputation: 2778

how do I mock a fake folder with fake images inside?

def local_cv2_imread():
    # use as a side effect

    return 'fakeImg1'

def test_read_images(self):
    with mock.patch('os.listdir') as mock_listdir:
        with mock.patch('package.module.cv2.imread') as mock_imread:
            mock_listdir.return_value = ['fake_path']
            mock_imread.side_effect = local_cv2_imread
            images = read_images('a_real_path')
            self.assertEqual(images, ['fakeImg1']

Upvotes: 0

Exho
Exho

Reputation: 318

If you actually need temporary files, you should check tempfile.

It allows you to create temporary files and directories which provide automatic cleanup, so there are no trash files if you use this while having the opportunity to test what you want.

EDIT

If you don't really want to use tempfiles nor tempfolders, here is another solution concerning your problem:

Generate in-memory image for your test.

from io import BytesIO
from PIL import Image

def create_in_memory_image():
    in_memory_file = BytesIO()
    image = Image.new('RGBA',
                      size=(0, 0),
                      color=(155, 0, 0))
    image.save(in_memory_file,
               'png')
    in_memory_file.name = 'tmp_testing_name.png'
    in_memory_file.seek(0)
    return in_memory_file

Upvotes: 4

Related Questions