Подтвердить что ты не робот

Python Смещение функции из импортированного модуля

Я хочу понять, как @patch функция из импортированного модуля.

Вот где я до сих пор.

приложение /mocking.py:

from app.my_module import get_user_name

def test_method():
  return get_user_name()

if __name__ == "__main__":
  print "Starting Program..."
  test_method()

приложение /my _module/__ __ INIT ру:.

def get_user_name():
  return "Unmocked User"

тест /mock -test.py:

import unittest
from app.mocking import test_method 

def mock_get_user():
  return "Mocked This Silly"

@patch('app.my_module.get_user_name')
class MockingTestTestCase(unittest.TestCase):

  def test_mock_stubs(self, mock_method):
    mock_method.return_value = 'Mocked This Silly')
    ret = test_method()
    self.assertEqual(ret, 'Mocked This Silly')

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

Это работает не, как я ожидал. Модуль "исправленный" просто возвращает нефиксированное значение get_user_name. Как мне высмеять методы из других пакетов, которые я импортирую в тестируемое пространство имен?

4b9b3361

Ответ 1

Когда вы используете декоратор patch из пакета unittest.mock, вы не исправляете пространство имен, из которого импортируется модуль (в данном случае app.my_module.get_user_name), вы его исправляете в пространство имен под тестом app.mocking.get_user_name.

Чтобы сделать выше с помощью Mock, попробуйте что-то вроде ниже:

from mock import patch
from app.mocking import test_method 

class MockingTestTestCase(unittest.TestCase):

    @patch('app.mocking.get_user_name')
    def test_mock_stubs(self, test_patch):
        test_patch.return_value = 'Mocked This Silly'
        ret = test_method()
        self.assertEqual(ret, 'Mocked This Silly')

В стандартную библиотечную документацию входит полезный описывающий это.

Ответ 2

В то время как Матти Джон ответ решает вашу проблему (и тоже помог мне, спасибо!), я бы предложил локализовать замену оригинальной функции get_user_name с насмешкой. Это позволит вам контролировать, когда функция будет заменена, а когда нет. Кроме того, это позволит вам сделать несколько замен в одном и том же тесте. Чтобы сделать это, используйте выражение "с" в симпатичной форме:

from mock import patch

class MockingTestTestCase(unittest.TestCase):

    def test_mock_stubs(self):
        with patch('app.mocking.get_user_name', return_value = 'Mocked This Silly'):
            ret = test_method()
            self.assertEqual(ret, 'Mocked This Silly')