如何解决如何在 Python 中模拟类实例不是类函数
我很难模拟一个对象的实例。
我想编写一个单元测试来测试使用类实例的“my_func”函数。我知道如何模拟类函数,但是,我不知道如何模拟类(对象)本身(不是函数)的实例。
在我的模块文件中:
# my_module.py
import fancypackage1
import fancypackage2
def my_func():
x = fancypackage1.someClass.somefunction() # I kNow how to mock this
myclient = fancypackage2.Client() # I don't kNow how to mock this
myresult = do_something(myclient,x) # I kNow how to mock this
return myresult
在我的测试文件中:
# test_my_module.py
import pytest
import mock
import fancypackage1
import fancypackage2
from my_module import my_func
def test_my_func(mocker):
mock_someclass_somefunction = mocker.patch('my_module.fancypackage1.someClass.somefunction')
mock_someclass_somefunction.return_value = 'hello'
mock_client = mocker.patch.object(fancypackage2.Client,'__init__') # TypeError: __init__() should return None,not 'Magicmock'
mock_do_something = mocker.patch('my_module.do_something')
my_func()
mock_do_something.assert_called_with(mock_client,'hello')
-
因为我不知道如何模拟一个类的实例,但我知道如何模拟一个类方法,所以我认为对于类的实例,使用构造函数可能会起作用 - 并且所以我使用了 init,但不幸的是这对我不起作用,我收到一个错误:
E TypeError: __init__() should return None,not 'Magicmock'
-
以上都行不通后,我尝试通过一个定制的fixture:
@pytest.fixture def client_constructor_mock(): my_client = fancypackage2.Client() return my_client def test_my_func(mocker,client_constructor_mock): mock_someclass_somefunction = mocker.patch('my_module.fancypackage1.someClass.somefunction') mock_someclass_somefunction.return_value = 'hello' mock_client = client_constructor_mock mock_do_something = mocker.patch('my_module.do_something') my_func() mock_do_something.assert_called_with(mock_client,'hello')
不幸的是,这也不起作用。我得到的错误:
> mock_do_something.assert_called_with(mock_client,'hello')
E AssertionError: Expected call: do_something(<fancypackage2.Client object at 0x000001E6896A69C8>,'hello')
E Actual call: do_something(<fancypackage2.Client object at 0x000001E689721488>,'hello')
它告诉我 Client 类有两个不同的对象,这就是错误。
我在这里不知所措,如何确保正确模拟 myclient?非常感谢任何帮助。
解决方法
正如
__init__
所建议的那样,不能直接修补 TypeError
以操纵类创建的实例。
这可以通过修补类并请求该 return_value
对象的 mock
来完成,这是调用该类的 __init__
的结果。
代替
mock_client = mocker.patch.object(fancypackage2.Client,'__init__') # TypeError: __init__() should return None,not 'MagicMock'
以下应该有效:
mock_client_class = mocker.patch('my_module.fancypackage2.Client')
mock_client = mock_client_class.return_value
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。