Я пытаюсь протестировать созданную мной функцию, которая выполняет итерацию по списку и вызывает os.path.exists
для каждого элемента в списке. Мой тест передает функции список из 2 объектов. Мне нужно os.path.exists
, чтобы вернуть True
для одного из них и False
для другого. Я пробовал это:
import mock
import os
import unittest
class TestClass(unittest.TestCase):
values = {1 : True, 2 : False}
def side_effect(arg):
return values[arg]
def testFunction(self):
with mock.patch('os.path.exists') as m:
m.return_value = side_effect # 1
m.side_effect = side_effect # 2
arglist = [1, 2]
ret = test(argList)
Использование любой, но не обеих строк №1 и №2 дает NameError: global name 'side_effect' is not defined
Я нашел этот вопрос и изменил свой код следующим образом:
import mock
import os
class TestClass(unittest.TestCase):
values = {1 : True, 2 : False}
def side_effect(arg):
return values[arg]
def testFunction(self):
mockobj = mock(spec=os.path.exists)
mockobj.side_effect = side_effect
arglist = [1, 2]
ret = test(argList)
И это дает TypeError: 'module' object is not callable
. Я также пробовал переключать эти строки:
mockobj = mock(spec=os.path.exists)
mockobj.side_effect = side_effect
для этого
mockobj = mock(spec=os.path)
mockobj.exists.side_effect = side_effect
и это
mockobj = mock(spec=os)
mockobj.path.exists.side_effect = side_effect
с той же ошибкой. Может ли кто-нибудь указать, что я делаю неправильно и что я могу сделать, чтобы это работало?
РЕДАКТИРОВАТЬ: опубликовав свой ответ ниже, я понял, что мой первый фрагмент кода действительно работает, мне просто нужно m.side_effect = TestClass.side_effect
вместо m.side_effect = side_effect
.
mock(spec=os.path.exists)
(после импорта mock) в интерпретаторе, это не сработает с той же ошибкой. - person Yaroslav Nikitenko   schedule 19.01.2021os.path.exists
ведет себя по-разному. Если бы я показал только одно из них, это не было бы MWE, потому что это не продемонстрировало быos.path.exists
другого поведения. - person Yep_It's_Me   schedule 20.01.2021