У меня есть код Python, который должен быть запущен в Python 2 и 3. В python 2 dict.values() возвращает список, но в python 3 он возвращает dict_val объект. Поэтому, чтобы сделать его совместимым, я поставил list(dict.values()). Работает нормально. Но когда я делаю модульное тестирование с использованием Python Mock, есть одна ошибка. Я издеваюсь dict.values(), и он выдает примерно такой результат <MagicMock name='mock().values()' id='1099587993168'>, но когда я использую список, он создает этот пустой список. Ниже приведен пример.

Функциональный файл:

class abc():    
 def get_dict(self, key):#i want to mock this as its depends on other method also
    dic = {'key': {'smaplekey': 'samplevalue'}}# its sample - 
    return dic['key']

 def run_method(self, val):
    print val

 def a(self,key):
  print 'before list'
  print self.get_dict(key).values()
  print list(self.get_dict(key).values())
  b = list(self.get_dict(key).values())[0]
  print 'after list'
  self.run_method(b)

Тестовый файл:

import unittest
from mock import Mock, patch, MagicMock, ANY
import function_file
class TestA(unittest.TestCase):
  @patch('function_file.abc.run_method')
  @patch('function_file.abc.get_dict',MagicMock(return_vlaue={'key': {}}))
  def test_a(self, mock_run_method):
    manager = function_file.abc()
    result = manager.a('key')
    mock_run_method.assert_called_once_with(ANY, create=True)

if __name__ == '__main__':
    unittest.main()

Метод list делает магический фиктивный объект пустым списком, поэтому он не работает. И ниже ошибка питона

 before list
<MagicMock name='mock().values()' id='1099803145040'>
[]
E
======================================================================
ERROR: test_a (__main__.TestA)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/mock/mock.py", line 1305, in patched
    return func(*args, **keywargs)
  File "test_manager.py", line 9, in test_a
    result = manager.a('key')
  File "/usr/lib/python2.7/site-packages/abcd/function_file.py", line 13, in a
    b = list(self.get_dict(key).values())[0]
IndexError: list index out of range

----------------------------------------------------------------------
Ran 1 test in 0.004s

FAILED (errors=1)

Здесь это происходит внутри метода 'a' и печатается также, но метод list делает фиктивный объект пустым списком. Метод списка не должен делать фиктивный объект пустым списком

2
Ravishankar Kumar 21 Сен 2018 в 14:33

2 ответа

Лучший ответ

Менять:

@patch('get_dict',MagicMock(return_vlaue={'key': {}}))

Кому

@patch('__main__.get_dict', MagicMock(return_value={'key': 1}))

Патч цель должна в виде "module.object_name", вы пропустили пространство имен, ошибки остаются опечатками.

1
georgexsh 21 Сен 2018 в 11:54

Попробуйте @patch(__name__ + '.get_dict', MagicMock(return_value={'key': {}) чтобы дать правильную цель для вашего макета.

0
realmaniek 21 Сен 2018 в 12:05