100 lines
2.8 KiB
Plaintext
100 lines
2.8 KiB
Plaintext
This rule raises an issue when an assertion result is constant.
|
|
|
|
== Why is this an issue?
|
|
|
|
Assertions are meant to detect when code behaves as expected. An assertion which fails or succeeds all the time does not achieve this. Either it is redundant and should be removed to improve readabity or it is a mistake and the assertion should be corrected.
|
|
|
|
|
|
This rule raises an issue when an assertion method is given parameters which will make it succeed or fail all the time. It covers three cases:
|
|
|
|
* an ``++assert++`` statement or a unittest's ``++assertTrue++`` or ``++assertFalse++`` method is called with a value which will be always True or always False.
|
|
* a unittest's ``++assertIsNotNone++`` or ``++assertIsNone++`` method is called with a value which will always be None or never be None.
|
|
* a unittest's ``++assertIsNot++`` or ``++assertIs++`` method is called with a literal expression creating a new object every time (ex: ``++[1, 2, 3]++``).
|
|
|
|
|
|
=== Noncompliant code example
|
|
|
|
[source,python,diff-id=1,diff-type=noncompliant]
|
|
----
|
|
import unittest
|
|
|
|
class MyTestCase(unittest.TestCase):
|
|
def expect_not_none(self):
|
|
self.assertIsNotNone(round(1.5)) # Noncompliant: This assertion always succeeds because "round" returns a number, not None.
|
|
|
|
def helper_compare(param):
|
|
self.assertIs(param, [1, 2, 3]) # Noncompliant: This assertion always fails because [1, 2, 3] creates a new object.
|
|
----
|
|
|
|
|
|
=== Compliant solution
|
|
|
|
[source,python,diff-id=1,diff-type=compliant]
|
|
----
|
|
import unittest
|
|
|
|
class MyTestCase(unittest.TestCase):
|
|
def expect_not_none(self):
|
|
self.assertNotEqual(round(1.5), 0)
|
|
|
|
def helper_compare(param):
|
|
self.assertEqual(param, [1, 2, 3])
|
|
----
|
|
|
|
|
|
== Resources
|
|
|
|
=== Documentation
|
|
|
|
* https://docs.python.org/3/library/unittest.html[Python documentation - the ``++unittest++`` module]
|
|
* https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement[Python documentation - the ``++assert++`` statement]
|
|
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
=== Message
|
|
|
|
for assertTrue/assertFalse
|
|
|
|
* Replace this expression; its boolean value is constant.
|
|
|
|
for assertIsNone, assertIsNotNone
|
|
|
|
* Remove this identity assertion; it will always fail.
|
|
|
|
for assertIs, assertIsNot
|
|
|
|
* Primary: Replace this "assertIs" call with an "assertEqual" call.
|
|
* Secondary: This expression creates a new object every time.
|
|
|
|
|
|
=== Highlighting
|
|
|
|
for assertTrue/assertFalse: the argument
|
|
|
|
|
|
for assertIsNone, assertIsNotNone: the whole assertion
|
|
|
|
|
|
for assertIs, assertIsNot:
|
|
|
|
* primary: the assertion method
|
|
* secondary: the expression creating a new object every time
|
|
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
=== relates to: S5727
|
|
|
|
=== relates to: S5796
|
|
|
|
=== relates to: S5797
|
|
|
|
endif::env-github,rspecator-view[]
|