我有以下设置:
# 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
。
我一直在阅读文档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()
被调用并尝试进行外部调用时得到了一个错误。我的补丁安装不正确吗?
答案 0 :(得分:0)
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
方法并对其进行修饰。