I have some application method that uses the @typeguard.typechecked
decorator for performing runtime checks of the passed parameters:
class SalesDeal:
pass
@typechecked
def do_something(deal: SalesDeal):
pass
Inside a test I have fake class FakeSalesDeal
which implements a minimal mock for SalesDeal
(which is a very complicated class in reality):
class FakeSalesDeal:
pass
def test_foo():
deal = FakeSalesDeal()
do_something(deal)
This test will of course fail because the @typechecked
decorator will raise an error due to a different class.
Is there a way to mock/fake the class of FakeSalesDeal
in order make the test pass?
You can use MagicMock
with spec
set to SalesDeal
instead of creating a fake class.
isinstance(mock, SalesDeal)
will be True
for that mock object & you should be able to bypass the typecheck.
from unittest.mock import MagicMock
# ...
def test_foo():
deal = MagicMock(spec=SalesDeal)
print(isinstance(deal, SalesDeal))
do_something(deal)
test_foo()
This prints:
True
& doesn't throw any type check error.
This works because typechecked
explicitly checks for Mock
objects being passed with:
if expected_type is Any or isinstance(value, Mock):
return
Code from here
So if you use proper mocks, typechecked
should not be causing any issues for you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With