gpt4 book ai didi

python-3.x - 如何在 Python 中模拟类实例(不是类函数)

转载 作者:行者123 更新时间:2023-12-05 02:43:48 25 4
gpt4 key购买 nike

我很难模拟一个对象的实例。

我想编写一个单元测试来测试使用类实例的“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__() 应该返回 None,而不是 '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 所建议的那样直接修补以操纵类创建的实例。这可以通过修补类并请求 mock 对象的 return_value 来完成,这是调用该类的 __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

关于python-3.x - 如何在 Python 中模拟类实例(不是类函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66753577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com