gpt4 book ai didi

python - 断言 __init__ 是用正确的参数调用的

转载 作者:太空狗 更新时间:2023-10-29 17:45:17 24 4
gpt4 key购买 nike

我正在使用 python 模拟来断言特定对象是使用正确的参数创建的。这是我的代码的样子:

class Installer:
def __init__(foo, bar, version):
# Init stuff
pass
def __enter__(self):
return self

def __exit__(self, type, value, tb):
# cleanup
pass

def install(self):
# Install stuff
pass

class Deployer:
def deploy(self):
with Installer('foo', 'bar', 1) as installer:
installer.install()

现在,我想断言 installer 是用正确的参数创建的。这是我到目前为止的代码:

class DeployerTest(unittest.TestCase):
@patch('Installer', autospec=True)
def testInstaller(self, mock_installer):
deployer = Deployer()
deployer.deploy()

# Can't do this :-(
mock_installer.__init__.assert_called_once_with('foo', 'bar', 1)

这是我得到的错误:

  File "test_deployment.py", line .., in testInstaller
mock_installer.__init__.assert_called_once_with('foo', 'bar', 1)
AttributeError: 'function' object has no attribute 'assert_called_once_with'

这里是固定代码(称之为test.py)。谢谢大家!

import unittest
from mock import patch

class Installer:
def __init__(self, foo, bar, version):
# Init stuff
pass

def __enter__(self):
return self

def __exit__(self, type, value, tb):
# cleanup
pass

def install(self):
# Install stuff
pass

class Deployer:
def deploy(self):
with Installer('foo', 'bar', 1) as installer:
installer.install()

class DeployerTest(unittest.TestCase):
@patch('tests.test.Installer', autospec=True)
def testInstaller(self, mock_installer):
deployer = Deployer()
deployer.deploy()

# Can't do this :-(
# mock_installer.__init__.assert_called_once_with('foo', 'bar', 1)

# Try this instead
mock_installer.assert_called_once_with('foo', 'bar', 1)

最佳答案

所以,您收到的错误消息实际上是因为您没有正确检查模拟。您在这里必须了解的是,在您的装饰器中,您最终是在说,对 Installer 的调用将返回一个 Mock 对象。

因此,对于关于您正在修补的地方的任何 Installer() 调用,其返回值将改为调用 Mock()

因此,您真正想要检查的断言只是在 mock_installer 中,而不是在 mock_installer.__init__ 中。:

mock_installer.assert_called_once_with('foo', 'bar', 1)

这是对您的代码所做的修改:

class DeployerTest(unittest.TestCase):

@patch('Installer', autospec=True)
def testInstaller(self, mock_installer):
deployer = Deployer()
deployer.deploy()

mock_installer.assert_called_once_with('foo', 'bar', 1)

一些额外的信息来提供更多的解释,如果你现在正在测试是否在你的上下文管理器中调用了安装,你必须在这里意识到你实际上必须检查你的 __enter__,所以一个结构是这样的:

为了清晰起见,在您的测试方法中创建一个 mock_obj 并且:

mock_obj = mock_installer.return_value

现在,在您的上下文管理器中,您将需要查看对__enter__() 的调用。如果您不知道这是为什么,请阅读上下文管理器。

因此,考虑到这一点,您只需按照以下方式执行检查:

mock_obj.__enter__().install.assert_called_once_with()

关于python - 断言 __init__ 是用正确的参数调用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35711975/

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