gpt4 book ai didi

python - 如何模拟类方法的 cls 参数?

转载 作者:行者123 更新时间:2023-12-05 07:21:32 24 4
gpt4 key购买 nike

我有一个使用类方法作为自定义构造函数的类。

# my_module.py
class MyClass:
def __init__(self, my_arg):
self.my_arg = my_arg

@classmethod
def my_constructor(cls):
return cls("my val")

我想在测试中断言已使用正确的值调用构造函数并返回实例。

我尝试了几种打补丁的方法,但无法正常工作。

我尝试修补整个类,使用 wraps 参数来执行真正的方法。

# my_test.py
from unittest import TestCase
from unittest.mock import patch

from my_module import MyClass


class MyClassTestCase(TestCase):
@patch("my_module.MyClass", wraps=MyClass)
def test_my_constructor(self, my_class):
result = my_class.my_constructor()
my_class.assert_called_once_with("my val")
self.assertEqual(result, my_class.return_value)

这里的问题是 _my_module.MyClass.my_class_ 方法获取的 cls 参数不是我的 Mock,而是真正的 MyClass类。

我的另一个想法是使用 patch.object 来修补真正的 __init__ 构造函数,但这也不起作用。这次是因为 __init__ 不应该返回任何东西,但是 MagicMock 有一个返回值。

# my_test.py
from unittest import TestCase
from unittest.mock import patch

from my_module import MyClass


class MyClassTestCase(TestCase):
@patch.object(MyClass, "__init__")
def test_my_constructor(self, init):
result = MyClass.my_constructor()
init.assert_called_once_with("my val")
self.assertEqual(result, init.return_value)

是否有实际的方法来断言 MyClass 类已由 _my_constructor_ 使用给定参数实例化并返回?

最佳答案

模拟 __new__ 而不是 __init__并断言将是init.assert_called_once_with(MyClass, "my val")

关于python - 如何模拟类方法的 cls 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56848889/

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