2 回答
TA贡献1765条经验 获得超5个赞
在代码示例中,有三件事可能需要测试:函数 、 类 和 函数 。我了解您的测试代码,因此您希望确保函数调用do_stuff返回的实例上。create_instanceBarfoofoocreate_instance
由于原始函数可以控制创建的实例,因此问题的解决方案是模拟,以便您的测试获得对移交给 foo 的对象的控制:create_instancecreate_instance
import unittest
from unittest import TestCase
from unittest.mock import patch, MagicMock
from SO_60624698 import foo
class TestFoo(TestCase):
@patch('SO_60624698.create_instance')
def test_foo_calls_do_stuff_on_proper_instance (
self, create_instance_mock ):
# Setup
Bar_mock = MagicMock()
create_instance_mock.return_value = Bar_mock
# Exercise
foo(1, 2, 3) # args are irrelevant
# Verify
Bar_mock.do_stuff.assert_called()
if __name__ == '__main__':
unittest.main()
此外,您可能还希望测试参数是否正确传递给 。这可以作为单独的测试实现:foocreate_instance
...
@patch('SO_60624698.create_instance')
def test_foo_passes_arguments_to_create_instance (
self, create_instance_mock ):
# Setup
create_instance_mock.return_value = MagicMock()
# Exercise
foo(1, 22, 333)
# Verify
create_instance_mock.assert_called_with(1, 22, 333)
当然,要完成对象生成的整个测试,您可以直接进行测试,方法是调用它并检查返回的实例,以确定它是否正确使用了其参数来构造实例。create_instanceBarBar
TA贡献1865条经验 获得超7个赞
由于返回 Mock 的一个实例(或者实际上是 MagicMock,但它从其基础 - Mock 继承了相关方法),因此您有可用的assert_called_with方法,这应该可以解决问题。请注意,此方法对 / 敏感 - 您必须断言完全相同的调用。patch
args
kwargs
另一个注意事项:使用 patch.object 而不是在这里可能是一个更好的做法。patch
添加回答
举报