模拟实例化的类变量

时间:2019-06-06 16:41:41

标签: python unit-testing mocking

我有以下设置:

# 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()

(类Barmethod_1实际上有点复杂;我知道这种当前设置似乎是多余的)

我的目标是为main()创建一个测试,但是我想通过补丁模拟EXTERNAL_CALL

我一直在阅读文档here以及有关正确修补位置的信息,但是我仍然必须犯一个错误。

我目前的想法是,由于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 :(得分:0)

patch装饰器应该装饰您的测试方法本身。因此,基本上只需合并您的mocktest_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方法并对其进行修饰。