Проблема с насмешкой не требует цикла - PullRequest
0 голосов
/ 24 марта 2020

Я использую макет для проверки чего-то, что я разработал. В приложении я использую glob to l oop для чего-то в каталоге, например: '/tmp/*.png'. Он соберет все файлы .png в каталоге и вернет список этих файлов.

Когда я глушу glob, он возвращает вызовы. Однако это не go хорошо при использовании l oop в for l oop.

#stack.py
import os
import click
import hashlib
import glob

def bar(x):
    return os.path.basename(x)

def foo(path):
    images = glob.glob(path)
    for i in images:
        bar(i)


if __name__ == '__main__':
    foo()

#test_stack.py
import os
import unittest
import mock
import tempfile
import stack


class StackTest(unittest.TestCase):

    temp_dir = tempfile.gettempdir()
    temp_rg3 = os.path.join(temp_dir, "testfile.rg3")

    @mock.patch('stack.os')
    @mock.patch('stack.hashlib')
    @mock.patch('stack.glob')
    def test_stack(self, mock_glob, mock_hashlib, mock_os):
        stack.foo(self.temp_rg3)

        print(mock_glob.method_calls)
        print(mock_os.method_calls)

Это возвращение:

[call.glob('/tmp/testfile.rg3')]
[]
[]

После глобуса был вызван в glob.glob(path), его возвращаемое значение не отображается для images. Таким образом, for l oop не начинается и bar(i) не вызывается, следовательно, mock_os не возвращает вызовов.

1 Ответ

1 голос
/ 24 марта 2020

Если я понял ваш вопрос, похоже, вы не установили возвращаемое значение для своего макета.

Когда вы генерируете объект MagicMock, его возвращаемым значением по умолчанию является сам экземпляр макета, как объяснено здесь . Этот экземпляр не является итератором и, следовательно, ничего не будет делать при итерации с помощью for для l oop.

. Вы можете предоставить возвращаемые значения, как показано ниже, изменив свой макет, чтобы он также был функцией speci c Вы звоните:

@mock.patch('stack.os')
@mock.patch('stack.hashlib')
@mock.patch('stack.glob.glob', return_value=['a.png', 'b.png', 'c.png'])
def test_stack(self, mock_glob, mock_hashlib, mock_os):
    stack.foo(self.temp_rg3)

    print(mock_glob.method_calls)
    print(mock_os.method_calls)
...