diff --git a/ironic/tests/unit/objects/test_conductor.py b/ironic/tests/unit/objects/test_conductor.py index 73c8df7713..af65f0deab 100644 --- a/ironic/tests/unit/objects/test_conductor.py +++ b/ironic/tests/unit/objects/test_conductor.py @@ -15,6 +15,7 @@ # under the License. import datetime +import types import mock from oslo_utils import timeutils @@ -87,7 +88,8 @@ class TestConductorObject(db_base.DbTestCase): self.assertEqual(expected, mock_get_cdr.call_args_list) self.assertEqual(self.context, c._context) - @mock.patch.object(base.IronicObject, 'get_target_version') + @mock.patch.object(base.IronicObject, 'get_target_version', + spec_set=types.FunctionType) def _test_register(self, mock_target_version, update_existing=False): mock_target_version.return_value = '1.5' host = self.fake_conductor['hostname'] @@ -111,7 +113,8 @@ class TestConductorObject(db_base.DbTestCase): def test_register_update_existing_true(self): self._test_register(update_existing=True) - @mock.patch.object(objects.Conductor, 'unregister_all_hardware_interfaces') + @mock.patch.object(objects.Conductor, 'unregister_all_hardware_interfaces', + autospec=True) def test_unregister(self, mock_unreg_ifaces): host = self.fake_conductor['hostname'] with mock.patch.object(self.dbapi, 'get_conductor', @@ -122,7 +125,7 @@ class TestConductorObject(db_base.DbTestCase): c = objects.Conductor.get_by_hostname(self.context, host) c.unregister() mock_unregister_cdr.assert_called_once_with(host) - mock_unreg_ifaces.assert_called_once_with() + mock_unreg_ifaces.assert_called_once_with(mock.ANY) def test_register_hardware_interfaces(self): host = self.fake_conductor['hostname'] diff --git a/ironic/tests/unit/objects/test_notification.py b/ironic/tests/unit/objects/test_notification.py index 58f6a757a7..e6e40ba820 100644 --- a/ironic/tests/unit/objects/test_notification.py +++ b/ironic/tests/unit/objects/test_notification.py @@ -94,7 +94,7 @@ class TestNotificationBase(test_base.TestCase): actual_payload = mock_notify.call_args[1]['payload'] self.assertJsonEqual(expected_payload, actual_payload) - @mock.patch('ironic.common.rpc.VERSIONED_NOTIFIER') + @mock.patch('ironic.common.rpc.VERSIONED_NOTIFIER', autospec=True) def test_emit_notification(self, mock_notifier): self.config(notification_level='debug') payload = self.TestNotificationPayload(an_extra_field='extra', @@ -130,7 +130,7 @@ class TestNotificationBase(test_base.TestCase): expected_publisher='ironic-conductor.host', notif_level=fields.NotificationLevel.DEBUG) - @mock.patch('ironic.common.rpc.VERSIONED_NOTIFIER') + @mock.patch('ironic.common.rpc.VERSIONED_NOTIFIER', autospec=True) def test_no_emit_level_too_low(self, mock_notifier): # Make sure notification doesn't emit when set notification # level < config level @@ -153,7 +153,7 @@ class TestNotificationBase(test_base.TestCase): self.assertFalse(mock_notifier.called) - @mock.patch('ironic.common.rpc.VERSIONED_NOTIFIER') + @mock.patch('ironic.common.rpc.VERSIONED_NOTIFIER', autospec=True) def test_no_emit_notifs_disabled(self, mock_notifier): # Make sure notifications aren't emitted when notification_level # isn't defined, indicating notifications should be disabled @@ -175,7 +175,7 @@ class TestNotificationBase(test_base.TestCase): self.assertFalse(mock_notifier.called) - @mock.patch('ironic.common.rpc.VERSIONED_NOTIFIER') + @mock.patch('ironic.common.rpc.VERSIONED_NOTIFIER', autospec=True) def test_no_emit_schema_not_populated(self, mock_notifier): self.config(notification_level='debug') payload = self.TestNotificationPayload(an_extra_field='extra', @@ -195,7 +195,7 @@ class TestNotificationBase(test_base.TestCase): mock_context) self.assertFalse(mock_notifier.called) - @mock.patch('ironic.common.rpc.VERSIONED_NOTIFIER') + @mock.patch('ironic.common.rpc.VERSIONED_NOTIFIER', autospec=True) def test_emit_notification_empty_schema(self, mock_notifier): self.config(notification_level='debug') payload = self.TestNotificationPayloadEmptySchema(fake_field='123') diff --git a/ironic/tests/unit/objects/test_objects.py b/ironic/tests/unit/objects/test_objects.py index d133f74e32..7a25b9cd39 100644 --- a/ironic/tests/unit/objects/test_objects.py +++ b/ironic/tests/unit/objects/test_objects.py @@ -14,6 +14,7 @@ import contextlib import datetime +import types import iso8601 import mock @@ -436,7 +437,8 @@ class _TestObject(object): self.assertFalse(mock_convert.called) @mock.patch.object(MyObj, 'convert_to_version', autospec=True) - @mock.patch.object(base.IronicObject, 'get_target_version') + @mock.patch.object(base.IronicObject, 'get_target_version', + spec_set=types.FunctionType) def test_do_version_changes_for_db_pinned(self, mock_target_version, mock_convert): # obj is same version as pinned, no conversion done @@ -456,7 +458,8 @@ class _TestObject(object): mock_target_version.assert_called_with() self.assertFalse(mock_convert.called) - @mock.patch.object(base.IronicObject, 'get_target_version') + @mock.patch.object(base.IronicObject, 'get_target_version', + spec_set=types.FunctionType) def test_do_version_changes_for_db_downgrade(self, mock_target_version): # obj is 1.5; convert to 1.4 mock_target_version.return_value = '1.4' @@ -542,7 +545,7 @@ class _TestObject(object): # Mock obj_load_attr as this is what is called if an attribute that we # try to access is not yet set. For all ironic objects it's a noop, # we've implemented it in MyObj purely for testing - with mock.patch.object(obj, 'obj_load_attr'): + with mock.patch.object(obj, 'obj_load_attr', autospec=True): MyObj._from_db_object(self.context, obj, dbobj, fields=['foo', 'bar']) self.assertEqual(obj.__class__.VERSION, obj.VERSION) @@ -611,7 +614,8 @@ class _TestObject(object): self.assertRaises(object_exception.IncompatibleObjectVersion, obj.get_target_version) - @mock.patch.object(base.IronicObject, 'get_target_version') + @mock.patch.object(base.IronicObject, 'get_target_version', + spec_set=types.FunctionType) def test_supports_version(self, mock_target_version): mock_target_version.return_value = "1.5" obj = MyObj(self.context) @@ -756,7 +760,8 @@ class TestObjectSerializer(test_base.TestCase): for item in thing2: self.assertIsInstance(item, MyObj) - @mock.patch('ironic.objects.base.IronicObject.indirection_api') + @mock.patch('ironic.objects.base.IronicObject.indirection_api', + autospec=True) def _test_deserialize_entity_newer(self, obj_version, backported_to, mock_indirection_api, my_version='1.6'): @@ -827,7 +832,7 @@ class TestObjectSerializer(test_base.TestCase): self.assertFalse(mock_release_mapping.called) @mock.patch.object(base.IronicObject, 'convert_to_version', autospec=True) - @mock.patch.object(base.IronicObject, 'get_target_version') + @mock.patch.object(base.IronicObject, 'get_target_version', autospec=True) def test_serialize_entity_unpinned_api(self, mock_version, mock_convert): """Test single element serializer with no backport, unpinned.""" mock_version.return_value = MyObj.VERSION @@ -848,7 +853,8 @@ class TestObjectSerializer(test_base.TestCase): self.assertFalse(mock_convert.called) @mock.patch.object(base.IronicObject, 'convert_to_version', autospec=True) - @mock.patch.object(base.IronicObject, 'get_target_version') + @mock.patch.object(base.IronicObject, 'get_target_version', + spec_set=types.FunctionType) def test_serialize_entity_unpinned_conductor(self, mock_version, mock_convert): """Test single element serializer with no backport, unpinned.""" @@ -869,7 +875,7 @@ class TestObjectSerializer(test_base.TestCase): mock_version.assert_called_once_with() self.assertFalse(mock_convert.called) - @mock.patch.object(base.IronicObject, 'get_target_version') + @mock.patch.object(base.IronicObject, 'get_target_version', autospec=True) def test_serialize_entity_pinned_api(self, mock_version): """Test single element serializer with backport to pinned version.""" mock_version.return_value = '1.4' @@ -888,7 +894,8 @@ class TestObjectSerializer(test_base.TestCase): self.assertEqual('miss', data['missing']) self.assertFalse(mock_version.called) - @mock.patch.object(base.IronicObject, 'get_target_version') + @mock.patch.object(base.IronicObject, 'get_target_version', + spec_set=types.FunctionType) def test_serialize_entity_pinned_conductor(self, mock_version): """Test single element serializer with backport to pinned version.""" mock_version.return_value = '1.4' @@ -908,7 +915,8 @@ class TestObjectSerializer(test_base.TestCase): self.assertNotIn('ironic_object.changes', primitive) mock_version.assert_called_once_with() - @mock.patch.object(base.IronicObject, 'get_target_version') + @mock.patch.object(base.IronicObject, 'get_target_version', + spec_set=types.FunctionType) def test_serialize_entity_invalid_pin(self, mock_version): mock_version.side_effect = object_exception.InvalidTargetVersion( version='1.6') @@ -963,7 +971,7 @@ class TestObjectSerializer(test_base.TestCase): class TestRegistry(test_base.TestCase): - @mock.patch('ironic.objects.base.objects') + @mock.patch('ironic.objects.base.objects', autospec=True) def test_hook_chooses_newer_properly(self, mock_objects): reg = base.IronicObjectRegistry() reg.registration_hook(MyObj, 0) @@ -979,7 +987,7 @@ class TestRegistry(test_base.TestCase): reg.registration_hook(MyNewerObj, 0) self.assertEqual(MyNewerObj, mock_objects.MyObj) - @mock.patch('ironic.objects.base.objects') + @mock.patch('ironic.objects.base.objects', autospec=True) def test_hook_keeps_newer_properly(self, mock_objects): reg = base.IronicObjectRegistry() reg.registration_hook(MyObj, 0) diff --git a/ironic/tests/unit/objects/test_port.py b/ironic/tests/unit/objects/test_port.py index abe1758679..734c0a9cf8 100644 --- a/ironic/tests/unit/objects/test_port.py +++ b/ironic/tests/unit/objects/test_port.py @@ -14,6 +14,7 @@ # under the License. import datetime +import types import mock from oslo_config import cfg @@ -146,13 +147,15 @@ class TestPortObject(db_base.DbTestCase, obj_utils.SchemasTestMixIn): self.assertIsInstance(ports[0], objects.Port) self.assertEqual(self.context, ports[0]._context) - @mock.patch.object(obj_base.IronicObject, 'supports_version') + @mock.patch.object(obj_base.IronicObject, 'supports_version', + spec_set=types.FunctionType) def test_supports_physical_network_supported(self, mock_sv): mock_sv.return_value = True self.assertTrue(objects.Port.supports_physical_network()) mock_sv.assert_called_once_with((1, 7)) - @mock.patch.object(obj_base.IronicObject, 'supports_version') + @mock.patch.object(obj_base.IronicObject, 'supports_version', + spec_set=types.FunctionType) def test_supports_physical_network_unsupported(self, mock_sv): mock_sv.return_value = False self.assertFalse(objects.Port.supports_physical_network()) diff --git a/ironic/tests/unit/objects/test_volume_connector.py b/ironic/tests/unit/objects/test_volume_connector.py index 817914d891..fad9b4a069 100644 --- a/ironic/tests/unit/objects/test_volume_connector.py +++ b/ironic/tests/unit/objects/test_volume_connector.py @@ -13,6 +13,7 @@ # under the License. import datetime +import types import mock from testtools.matchers import HasLength @@ -31,8 +32,10 @@ class TestVolumeConnectorObject(db_base.DbTestCase, super(TestVolumeConnectorObject, self).setUp() self.volume_connector_dict = db_utils.get_test_volume_connector() - @mock.patch('ironic.objects.VolumeConnector.get_by_uuid') - @mock.patch('ironic.objects.VolumeConnector.get_by_id') + @mock.patch('ironic.objects.VolumeConnector.get_by_uuid', + spec_set=types.FunctionType) + @mock.patch('ironic.objects.VolumeConnector.get_by_id', + spec_set=types.FunctionType) def test_get(self, mock_get_by_id, mock_get_by_uuid): id = self.volume_connector_dict['id'] uuid = self.volume_connector_dict['uuid'] diff --git a/ironic/tests/unit/objects/test_volume_target.py b/ironic/tests/unit/objects/test_volume_target.py index cbb467947f..2734d7d35a 100644 --- a/ironic/tests/unit/objects/test_volume_target.py +++ b/ironic/tests/unit/objects/test_volume_target.py @@ -13,6 +13,7 @@ # under the License. import datetime +import types import mock from testtools.matchers import HasLength @@ -30,8 +31,10 @@ class TestVolumeTargetObject(db_base.DbTestCase, obj_utils.SchemasTestMixIn): super(TestVolumeTargetObject, self).setUp() self.volume_target_dict = db_utils.get_test_volume_target() - @mock.patch('ironic.objects.VolumeTarget.get_by_uuid') - @mock.patch('ironic.objects.VolumeTarget.get_by_id') + @mock.patch('ironic.objects.VolumeTarget.get_by_uuid', + spec_set=types.FunctionType) + @mock.patch('ironic.objects.VolumeTarget.get_by_id', + spec_set=types.FunctionType) def test_get(self, mock_get_by_id, mock_get_by_uuid): id = self.volume_target_dict['id'] uuid = self.volume_target_dict['uuid']