Насмешка над созданной переменной класса - PullRequest
0 голосов
/ 06 июня 2019

У меня есть следующие настройки:

# main.py

from foo import Foo
from bar import Bar

def main():
  foo = Foo()

  result = Bar.method_1(foo)

  print(result)
# bar.py

class Bar:

def method_1(foo):
    return foo.method_2()
# foo.py

class Foo:

  def __method():
    return EXTERNAL_CALL

  def method_2():
    return self.__method()

(класс Bar и method_1 немного сложнее в реальности; я знаю, что эта текущая настройка кажется избыточной)

Моя цель - создать тест для main(), но я хочу смоделировать EXTERNAL_CALL через патч.

Я читал документацию здесь и о том, где правильно установить исправления, но я все еще допускаю ошибку.

В настоящее время я думаю, что, поскольку main - это то, что создает экземпляр класса, мне нужно сделать следующее:

import unittest
from unittest import mock
from src import main, bar, foo

@mock.patch("main.Foo")
def mock(mock_class):
  mock_class.method_2.return_value = "MOCKED"

class TestModel(unittest.TestCase):
  def test_main():
    main.main()

Вместо распечатки MOCKED я получаю сообщение об ошибке при вызове __method() и попытке сделать внешний вызов. Мой патч настроен неправильно?

1 Ответ

0 голосов
/ 06 июня 2019

Декоратор patch должен украшать сам ваш тестовый метод. В общем, просто объедините ваши mock и test_main методы:

class TestModel(unittest.TestCase):
  @mock.patch("main.Foo")
  def test_main(self, mock_class):
    mock_class.return_value.method_2.return_value = "MOCKED"
    main.main()

Если вы хотите, чтобы класс моделировался во всех тестовых методах в вашем тестовом классе, вы можете определить метод setUp и декорировать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...