Fix calls to assert_called_once in unit tests
Mock has a method called assert_called_once_with to check that a mock
was called and the arguments it took were as expected. Mock does not
have a method called assert_called_once and calling it just creates a
mock bound to that name. This means that not only is nothing tested
when assert_called_once is used, the tests also don't warn about this.
This commit attempts to address this in two ways:
- all occurrences of assert_called_once are replaced with a real
assertion.
- the hacking check that nova uses to guard against this has been
copied to cinder's local hacking checks.
Fixing the assert_called_once issues also highlighted other mistakes
in certain tests which were addressed to make the tests pass.
Due to the nature of mock, this issue is also possible if a method is
misspelt or just mistakenly used and so the hacking check is only
addressing one very specific case. That said, it does appear to be a
common mistake and so is worth singling out.
Change-Id: Iedcc3f48d91f7ebd8878ccc3bca3d023503774bd
Closes-Bug: #1394544
This commit is contained in:
@@ -113,9 +113,21 @@ def check_no_log_audit(logical_line):
|
||||
yield(0, "N324: Found LOG.audit. Use LOG.info instead.")
|
||||
|
||||
|
||||
def check_assert_called_once(logical_line, filename):
|
||||
msg = ("N327: 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 'cinder/tests/' in filename:
|
||||
pos = logical_line.find('.assert_called_once(')
|
||||
if pos != -1:
|
||||
yield (pos, msg)
|
||||
|
||||
|
||||
def factory(register):
|
||||
register(no_vi_headers)
|
||||
register(no_translate_debug_logs)
|
||||
register(no_mutable_default_args)
|
||||
register(check_explicit_underscore_import)
|
||||
register(check_no_log_audit)
|
||||
register(check_assert_called_once)
|
||||
|
||||
Reference in New Issue
Block a user