макет метода, расположенного в __init__.py

1

Я хотел бы высмеять метод, который находится в init.py, но на самом деле он не работает.

Существует пример, чтобы продемонстрировать проблему и как я попытался написать unit тест:

Проверяемый код: src.main.myfile:

from src.main.utils import a_plus_b

def method_under_test():
    a_plus_b()

A_plus_b находится в __init__.py в модуле src.main.utils:

def a_plus_b():
    print("a + b")

Unittest:

import src.main.utils
import unittest
from mock import patch
from src.main.myfile import method_under_test

class my_Test(unittest.TestCase):
    def a_plus_b_side_effect():
       print("a_plus_b_side_effect")

    @patch.object(utils, 'a_plus_b')
    def test(self, mock_a_plus_b):
        mock_a_plus_b.side_effect = self.a_plus_b_side_effect
        method_under_test()

Единичный тест печатает "a + b", а не побочный эффект. Может ли кто-нибудь помочь мне в том, что я сделал неправильно?

Теги:
unit-testing
python-unittest
python-mock

1 ответ

1
Лучший ответ

Имя, которое нужно src.main.utils.a_plus_b, - это не src.main.utils.a_plus_b, а src.main.myfile.a_plus_b, так как это method_under_test.

@patch('src.main.myfile.a_plus_b')
def test(self, mock_a_plus_b):
    mock_a_plus_b.side_effect = self.a_plus_b_side_effect
    method_under_test()
  • 0
    Мне было интересно, почему метод src.main.utils.a_plus_b не может быть src.main.utils.a_plus_b . Я всегда исправлял оригинальные методы, а не импортированные объекты. Знаете ли вы причину, почему я не могу издеваться над src.main.utils.a_plus_b . другая опция для тестирования a_plus_b, если метод передается как аргумент ключевого слова. `def method_under_test (_a_plus_b = a_plus_b): _a_plus_b ()`
  • 0
    Если тестируемый код просто использовал import src.main.utils , а затем src.main.utils.a_plus_b , то полное имя будет правильным для исправления. См. Docs.python.org/3/library/unittest.mock.html#where-to-patch .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню