mock.assert_called_once() is not a valid method

mock.assert_called_once() is a no-op that tests nothing. Instead
mock.assert_called_once_with() should be used (or use
assertEqual(1, mock_obj.call_count) if you don't want to check
parameters).

Borrowed HACKING rule from Davanum Srinivas's nova patch to
prevent it from appearing again.

Change-Id: Idac1d3c89c07e13c9a209663f4e557fcb7547821
Closes-Bug: #1365751
Closes-Bug: #1300265
This commit is contained in:
Jacek Swiderski 2014-09-23 14:35:06 +02:00
parent 160dac816b
commit 5f53212853
8 changed files with 68 additions and 29 deletions

View File

@ -12,6 +12,7 @@ Neutron Specific Commandments
- [N321] Validate that jsonutils module is used instead of json - [N321] Validate that jsonutils module is used instead of json
- [N322] We do not use @authors tags in source files. We have git to track - [N322] We do not use @authors tags in source files. We have git to track
authorship. authorship.
- [N323] assert_called_once() is not a valid method
Creating Unit Tests Creating Unit Tests
------------------- -------------------

View File

@ -79,7 +79,19 @@ def no_author_tags(physical_line):
return pos, "N322: Don't use author tags" return pos, "N322: Don't use author tags"
def check_assert_called_once(logical_line, filename):
msg = ("N323: assert_called_once is a no-op. please use "
"assert_called_once_with to test with explicit parameters or an "
"assertEqual with call_count.")
if 'neutron/tests/' in filename:
pos = logical_line.find('.assert_called_once(')
if pos != -1:
yield (pos, msg)
def factory(register): def factory(register):
register(validate_log_translations) register(validate_log_translations)
register(use_jsonutils) register(use_jsonutils)
register(no_author_tags) register(no_author_tags)
register(check_assert_called_once)

View File

@ -68,10 +68,11 @@ class TestCiscoApicMechDriver(base.BaseTestCase,
self.driver.apic_manager.apic.transaction = self.fake_transaction self.driver.apic_manager.apic.transaction = self.fake_transaction
def test_initialize(self): def test_initialize(self):
mgr = self.driver.apic_manager
self.driver.initialize() self.driver.initialize()
mgr.ensure_infra_created_on_apic.assert_called_once() mgr = self.driver.apic_manager
mgr.ensure_bgp_pod_policy_created_on_apic.assert_called_once() self.assertEqual(1, mgr.ensure_infra_created_on_apic.call_count)
self.assertEqual(1,
mgr.ensure_bgp_pod_policy_created_on_apic.call_count)
def test_update_port_postcommit(self): def test_update_port_postcommit(self):
net_ctx = self._get_network_context(mocked.APIC_TENANT, net_ctx = self._get_network_context(mocked.APIC_TENANT,
@ -99,7 +100,7 @@ class TestCiscoApicMechDriver(base.BaseTestCase,
self.driver.update_port_postcommit(port_ctx) self.driver.update_port_postcommit(port_ctx)
mgr.get_router_contract.assert_called_once_with( mgr.get_router_contract.assert_called_once_with(
port_ctx.current['device_id']) port_ctx.current['device_id'])
mgr.ensure_context_enforced.assert_called_once() self.assertEqual(1, mgr.ensure_context_enforced.call_count)
mgr.ensure_external_routed_network_created.assert_called_once_with( mgr.ensure_external_routed_network_created.assert_called_once_with(
mocked.APIC_NETWORK, transaction='transaction') mocked.APIC_NETWORK, transaction='transaction')
mgr.ensure_logical_node_profile_created.assert_called_once_with( mgr.ensure_logical_node_profile_created.assert_called_once_with(
@ -119,17 +120,6 @@ class TestCiscoApicMechDriver(base.BaseTestCase,
mocked.APIC_NETWORK, mgr.get_router_contract.return_value, mocked.APIC_NETWORK, mgr.get_router_contract.return_value,
transaction='transaction') transaction='transaction')
def test_update_gw_port_postcommit_fail_contract_create(self):
net_ctx = self._get_network_context(mocked.APIC_TENANT,
mocked.APIC_NETWORK,
TEST_SEGMENT1, external=True)
port_ctx = self._get_port_context(mocked.APIC_TENANT,
mocked.APIC_NETWORK,
'vm1', net_ctx, HOST_ID1, gw=True)
mgr = self.driver.apic_manager
self.driver.update_port_postcommit(port_ctx)
mgr.ensure_external_routed_network_deleted.assert_called_once()
def test_create_network_postcommit(self): def test_create_network_postcommit(self):
ctx = self._get_network_context(mocked.APIC_TENANT, ctx = self._get_network_context(mocked.APIC_TENANT,
mocked.APIC_NETWORK, mocked.APIC_NETWORK,

View File

@ -62,10 +62,10 @@ class TestCiscoApicSync(base.BaseTestCase):
sync.core_plugin.get_ports.return_value = [{'id': 'port', sync.core_plugin.get_ports.return_value = [{'id': 'port',
'network_id': 'net'}] 'network_id': 'net'}]
sync.sync_base() sync.sync_base()
self.driver.create_network_postcommit.assert_called_once() self.assertEqual(1, self.driver.create_network_postcommit.call_count)
self.driver.create_subnet_postcommit.assert_called_once() self.assertEqual(1, self.driver.create_subnet_postcommit.call_count)
self.get_locked_port_and_binding.assert_called_once() self.assertEqual(1, self.get_locked_port_and_binding.call_count)
self.driver.create_port_postcommit.assert_called_once() self.assertEqual(1, self.driver.create_port_postcommit.call_count)
def test_sync_router(self): def test_sync_router(self):
sync = apic_sync.ApicRouterSynchronizer(self.driver) sync = apic_sync.ApicRouterSynchronizer(self.driver)
@ -74,4 +74,5 @@ class TestCiscoApicSync(base.BaseTestCase):
'network_id': 'net', 'network_id': 'net',
'device_id': 'dev'}] 'device_id': 'dev'}]
sync.sync_router() sync.sync_router()
self.driver.add_router_interface_postcommit.assert_called_once() self.assertEqual(
1, self.driver.add_router_interface_postcommit.call_count)

View File

@ -120,7 +120,8 @@ class TestCiscoApicL3Plugin(testlib_api.SqlTestCase,
mgr = self.plugin.manager mgr = self.plugin.manager
self.plugin.remove_router_interface(self.context, ROUTER, self.plugin.remove_router_interface(self.context, ROUTER,
interface_info) interface_info)
mgr.delete_contract_for_epg.assert_called_once() mgr.remove_router_interface.assert_called_once_with(
mocked.APIC_TENANT, mocked.APIC_ROUTER, mocked.APIC_NETWORK)
def test_add_router_interface_subnet(self): def test_add_router_interface_subnet(self):
self._test_add_router_interface(self.interface_info['subnet']) self._test_add_router_interface(self.interface_info['subnet'])

View File

@ -19,6 +19,7 @@ import mock
from oslo.config import cfg from oslo.config import cfg
from six.moves import queue as Queue from six.moves import queue as Queue
from neutron.api.v2 import attributes
from neutron import context from neutron import context
from neutron.extensions import loadbalancer from neutron.extensions import loadbalancer
from neutron import manager from neutron import manager
@ -155,6 +156,16 @@ class TestLoadBalancerPlugin(TestLoadBalancerPluginBase):
"""Call _get_pip twice and verify that a Port is created once.""" """Call _get_pip twice and verify that a Port is created once."""
port_dict = {'fixed_ips': [{'subnet_id': '10.10.10.10', port_dict = {'fixed_ips': [{'subnet_id': '10.10.10.10',
'ip_address': '11.11.11.11'}]} 'ip_address': '11.11.11.11'}]}
port_data = {
'tenant_id': 'tenant_id',
'name': 'port_name',
'network_id': 'network_id',
'mac_address': attributes.ATTR_NOT_SPECIFIED,
'admin_state_up': False,
'device_id': '',
'device_owner': 'neutron:' + constants.LOADBALANCER,
'fixed_ips': [{'subnet_id': '10.10.10.10'}]
}
self.plugin_instance._core_plugin.get_ports = mock.Mock( self.plugin_instance._core_plugin.get_ports = mock.Mock(
return_value=[]) return_value=[])
self.plugin_instance._core_plugin.create_port = mock.Mock( self.plugin_instance._core_plugin.create_port = mock.Mock(
@ -163,15 +174,18 @@ class TestLoadBalancerPlugin(TestLoadBalancerPluginBase):
radware_driver._get_pip(context.get_admin_context(), radware_driver._get_pip(context.get_admin_context(),
'tenant_id', 'port_name', 'tenant_id', 'port_name',
'network_id', '10.10.10.10') 'network_id', '10.10.10.10')
self.plugin_instance._core_plugin.get_ports.assert_called_once() self.plugin_instance._core_plugin.get_ports.assert_called_once_with(
self.plugin_instance._core_plugin.create_port.assert_called_once() mock.ANY, filters={'name': ['port_name']})
self.plugin_instance._core_plugin.create_port.assert_called_once_with(
mock.ANY, {'port': port_data})
self.plugin_instance._core_plugin.create_port.reset_mock() self.plugin_instance._core_plugin.create_port.reset_mock()
self.plugin_instance._core_plugin.get_ports.reset_mock() self.plugin_instance._core_plugin.get_ports.reset_mock()
self.plugin_instance._core_plugin.get_ports.return_value = [port_dict] self.plugin_instance._core_plugin.get_ports.return_value = [port_dict]
radware_driver._get_pip(context.get_admin_context(), radware_driver._get_pip(context.get_admin_context(),
'tenant_id', 'port_name', 'tenant_id', 'port_name',
'network_id', '10.10.10.10') 'network_id', '10.10.10.10')
self.plugin_instance._core_plugin.get_ports.assert_called_once() self.plugin_instance._core_plugin.get_ports.assert_called_once_with(
mock.ANY, filters={'name': ['port_name']})
self.assertFalse(self.plugin_instance._core_plugin.create_port.called) self.assertFalse(self.plugin_instance._core_plugin.create_port.called)
def test_rest_client_recover_was_called(self): def test_rest_client_recover_was_called(self):
@ -181,7 +195,9 @@ class TestLoadBalancerPlugin(TestLoadBalancerPluginBase):
radware_driver.rest_client._call = self.orig__call radware_driver.rest_client._call = self.orig__call
self.assertRaises(r_exc.RESTRequestFailure, self.assertRaises(r_exc.RESTRequestFailure,
radware_driver._verify_workflow_templates) radware_driver._verify_workflow_templates)
self.recover_mock.assert_called_once() self.recover_mock.assert_called_once_with('GET',
'/api/workflowTemplate',
None, None, False)
def test_rest_client_flip_servers(self): def test_rest_client_flip_servers(self):
radware_driver = self.plugin_instance.drivers['radware'] radware_driver = self.plugin_instance.drivers['radware']

View File

@ -79,3 +79,21 @@ class HackingTestCase(base.BaseTestCase):
self.assertEqual(2, checks.no_author_tags("# author: pele")[0]) self.assertEqual(2, checks.no_author_tags("# author: pele")[0])
self.assertEqual(2, checks.no_author_tags("# Author: pele")[0]) self.assertEqual(2, checks.no_author_tags("# Author: pele")[0])
self.assertEqual(3, checks.no_author_tags(".. moduleauthor:: pele")[0]) self.assertEqual(3, checks.no_author_tags(".. moduleauthor:: pele")[0])
def test_assert_called_once(self):
fail_code = """
mock = Mock()
mock.method(1, 2, 3, test='wow')
mock.method.assert_called_once()
"""
pass_code = """
mock = Mock()
mock.method(1, 2, 3, test='wow')
mock.method.assert_called_once_with()
"""
self.assertEqual(
1, len(list(checks.check_assert_called_once(fail_code,
"neutron/tests/test_assert.py"))))
self.assertEqual(
0, len(list(checks.check_assert_called_once(pass_code,
"neutron/tests/test_assert.py"))))

View File

@ -1745,25 +1745,25 @@ vrrp_instance VR_1 {
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
agent._queue = mock.Mock() agent._queue = mock.Mock()
agent.router_deleted(None, FAKE_ID) agent.router_deleted(None, FAKE_ID)
agent._queue.add.assert_called_once() self.assertEqual(1, agent._queue.add.call_count)
def test_routers_updated(self): def test_routers_updated(self):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
agent._queue = mock.Mock() agent._queue = mock.Mock()
agent.routers_updated(None, [FAKE_ID]) agent.routers_updated(None, [FAKE_ID])
agent._queue.add.assert_called_once() self.assertEqual(1, agent._queue.add.call_count)
def test_removed_from_agent(self): def test_removed_from_agent(self):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
agent._queue = mock.Mock() agent._queue = mock.Mock()
agent.router_removed_from_agent(None, {'router_id': FAKE_ID}) agent.router_removed_from_agent(None, {'router_id': FAKE_ID})
agent._queue.add.assert_called_once() self.assertEqual(1, agent._queue.add.call_count)
def test_added_to_agent(self): def test_added_to_agent(self):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
agent._queue = mock.Mock() agent._queue = mock.Mock()
agent.router_added_to_agent(None, [FAKE_ID]) agent.router_added_to_agent(None, [FAKE_ID])
agent._queue.add.assert_called_once() self.assertEqual(1, agent._queue.add.call_count)
def test_destroy_fip_namespace(self): def test_destroy_fip_namespace(self):
class FakeDev(object): class FakeDev(object):