Prevent approx from being used without a comparison (#9061)
Some of the top search-engine hits for pytest.approx use the function without actually comparing it to anything. This PR will cause these tests to fail by implementing approx.__bool__() to raise an AssertionError that briefly explains how to correctly use approx.
This commit is contained in:
parent
771c4b9313
commit
af42e7154a
|
@ -0,0 +1,15 @@
|
||||||
|
Using :func:`pytest.approx` in a boolean context now raises an error hinting at the proper usage.
|
||||||
|
|
||||||
|
It is apparently common for users to mistakenly use ``pytest.approx`` like this:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
assert pytest.approx(actual, expected)
|
||||||
|
|
||||||
|
While the correct usage is:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
assert actual == pytest.approx(expected)
|
||||||
|
|
||||||
|
The new error message helps catch those mistakes.
|
|
@ -100,6 +100,11 @@ class ApproxBase:
|
||||||
a == self._approx_scalar(x) for a, x in self._yield_comparisons(actual)
|
a == self._approx_scalar(x) for a, x in self._yield_comparisons(actual)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def __bool__(self):
|
||||||
|
raise AssertionError(
|
||||||
|
"approx() is not supported in a boolean context.\nDid you mean: `assert a == approx(b)`?"
|
||||||
|
)
|
||||||
|
|
||||||
# Ignore type because of https://github.com/python/mypy/issues/4266.
|
# Ignore type because of https://github.com/python/mypy/issues/4266.
|
||||||
__hash__ = None # type: ignore
|
__hash__ = None # type: ignore
|
||||||
|
|
||||||
|
|
|
@ -319,6 +319,12 @@ class TestApprox:
|
||||||
np_array = np.array(value)
|
np_array = np.array(value)
|
||||||
assert repr(approx(np_array)) == expected_repr_string
|
assert repr(approx(np_array)) == expected_repr_string
|
||||||
|
|
||||||
|
def test_bool(self):
|
||||||
|
with pytest.raises(AssertionError) as err:
|
||||||
|
assert approx(1)
|
||||||
|
|
||||||
|
assert err.match(r"approx\(\) is not supported in a boolean context")
|
||||||
|
|
||||||
def test_operator_overloading(self):
|
def test_operator_overloading(self):
|
||||||
assert 1 == approx(1, rel=1e-6, abs=1e-12)
|
assert 1 == approx(1, rel=1e-6, abs=1e-12)
|
||||||
assert not (1 != approx(1, rel=1e-6, abs=1e-12))
|
assert not (1 != approx(1, rel=1e-6, abs=1e-12))
|
||||||
|
|
Loading…
Reference in New Issue