我认为打补丁的正确方法是模拟Python类,然后在打补丁的类上调用.return_value
,但我不确定为什么.假设我有一些代码:
Class.py:
class SomeClass:
def __init__(self, some_value):
self.some_value = some_value
def add_to_value(self, add_value):
self.some_value = self.some_value + add_value
Function_thing.py:
from my_pkg.class import SomeClass
def some_function():
some_class_instance = SomeClass(5)
some_class_instance.add_to_value(6)
test_Function_thing.py:
from my_pkg.function_thing import some_function
class TestSomeFunction(TestCase)
# This works, and it knows the function was called with 6
@patch("my_pkg.function_thing.SomeClass")
def test_some_function_01(self, mock_some_class):
instance_mock = mock_some_class.return_value
some_function()
instance_mock.add_to_value.assert_called_with(6)
# This does not work.
@patch("my_pkg.function_thing.SomeClass.add_to_value")
def test_some_function_02(self, mock_add_to_value):
some_function()
# This succeeds.
mock_add_to_value.assert_called_once()
# This fails, saying it wasn't called with 6 but some object
mock_add_to_value.assert_called_with(6)
似乎,为了让模拟正确理解类是如何调用的,我们不能将函数作为一个整体来模拟.但我们可以断言该函数已被调用.我认为,要么断言函数被调用会失败,要么断言函数是如何调用的,或者两个都会成功.谢谢您提供的信息!