在另一个函数中调用的 Mock class 方法
Mock class method that is called within another function
我想模拟 class 方法的输出,该方法由不同模块中定义的函数调用。例如:
class_module.py
class my_class:
def __init__(self, user):
self.user = user
def my_method(self):
return [1,2,3]
def other_methods(self):
other_func(self.user)
return "something I do not really want to mock"
function_module.py
from class_module import my_class
def my_fun():
user = "me"
foo = my_class(user)
foo.other_methods()
return foo.my_method()
test.py
@patch("function_module.my_class")
def test_my_fun(class_mock):
class_mock.return_value.my_method.return_value = []
bar = my_fun()
assert bar == []
但是,我收到 AssertionError
说 [1,2,3] != []
。所以我想模拟永远不会发生在我想要的方法上。有人可以解释该怎么做吗?为什么会这样?
编辑
实际上,显示的实现不起作用,因为测试正在启动一个完全独立的过程。因此,不能模拟任何功能。抱歉我的误会
patch.object 允许修补 class.
的特定方法
class_module.py
class MyClass:
def __init__(self, user):
self.user = user
def my_method(self):
return [1, 2, 3]
def other_methods(self):
return "anything"
function_module.py
from class_module import MyClass
def my_fun():
user = "me"
foo = MyClass(user)
assert foo.other_methods() == "anything"
return foo.my_method()
test_my_func.py
from unittest.mock import patch
from class_module import MyClass
from function_module import my_fun
@patch.object(MyClass, "my_method")
def test_my_fun(my_method):
# given
any_value = [99, 98, 97]
my_method.return_value = any_value
# when
result = my_fun()
# then
assert result == any_value
有了这些文件,pytest test_my_func.py
成功通过。
我想模拟 class 方法的输出,该方法由不同模块中定义的函数调用。例如:
class_module.py
class my_class:
def __init__(self, user):
self.user = user
def my_method(self):
return [1,2,3]
def other_methods(self):
other_func(self.user)
return "something I do not really want to mock"
function_module.py
from class_module import my_class
def my_fun():
user = "me"
foo = my_class(user)
foo.other_methods()
return foo.my_method()
test.py
@patch("function_module.my_class")
def test_my_fun(class_mock):
class_mock.return_value.my_method.return_value = []
bar = my_fun()
assert bar == []
但是,我收到 AssertionError
说 [1,2,3] != []
。所以我想模拟永远不会发生在我想要的方法上。有人可以解释该怎么做吗?为什么会这样?
编辑
实际上,显示的实现不起作用,因为测试正在启动一个完全独立的过程。因此,不能模拟任何功能。抱歉我的误会
patch.object 允许修补 class.
的特定方法class_module.py
class MyClass:
def __init__(self, user):
self.user = user
def my_method(self):
return [1, 2, 3]
def other_methods(self):
return "anything"
function_module.py
from class_module import MyClass
def my_fun():
user = "me"
foo = MyClass(user)
assert foo.other_methods() == "anything"
return foo.my_method()
test_my_func.py
from unittest.mock import patch
from class_module import MyClass
from function_module import my_fun
@patch.object(MyClass, "my_method")
def test_my_fun(my_method):
# given
any_value = [99, 98, 97]
my_method.return_value = any_value
# when
result = my_fun()
# then
assert result == any_value
有了这些文件,pytest test_my_func.py
成功通过。