A linter that checks mocks are constructed with the spec argument
Project description
flake8-mock-spec
Do you use mocks and are concerned you are calling methods or accessing
attributes the mocked objects don't have? If not, you should be as that is a
sure way to inject bugs into your code and still have your tests pass. The
flake8-mock-spec
linter enforces the use of the spec
argument on mocks
ensuring that your use of mocks is compliant with the interface of the object
being mocked.
Getting Started
python -m venv venv
source ./venv/bin/activate
pip install flake8-mock-spec
flake8 test_source.py
On the following code:
# test_source.py
from unittest import mock
def test_foo():
mocked_foo = mock.Mock()
This will produce warnings such as:
flake8 test_source.py
test_source.py:5:22: TMS001 unittest.mock.Mock instances should be constructed with the spec or spec_set argument, more information: https://github.com/jdkandersson/flake8-mock-spec#fix-tms001
This can be resolved by changing the code to:
# test_source.py
from unittest import mock
from foo import Foo
def test_foo():
mocked_foo = mock.Mock(spec=Foo)
Rules
A few rules have been defined to allow for selective suppression:
TMS001
: checks thatunittest.mock.Mock
instances are constructed with thespec
orspec_set
argument.TMS002
: checks thatunittest.mock.MagicMock
instances are constructed with thespec
orspec_set
argument.
Fix TMS001
This linting rule is triggered by creating a unittest.mock.Mock
instance
without the spec
or spec_set
argument. For example:
from unittest import mock
def test_foo():
mocked_foo = mock.Mock()
This example can be fixed by using the spec
or spec_set
argument in the
constructor:
from unittest import mock
from foo import Foo
def test_foo():
mocked_foo = mock.Mock(spec=Foo)
from unittest import mock
from foo import Foo
def test_foo():
mocked_foo = mock.Mock(spec_set=Foo)
Fix TMS002
This linting rule is triggered by creating a unittest.mock.MagicMock
instance
without the spec
or spec_set
argument. For example:
from unittest import mock
def test_foo():
mocked_foo = mock.MagicMock()
This example can be fixed by using the spec
or spec_set
argument in the
constructor:
from unittest import mock
from foo import Foo
def test_foo():
mocked_foo = mock.MagicMock(spec=Foo)
from unittest import mock
from foo import Foo
def test_foo():
mocked_foo = mock.MagicMock(spec_set=Foo)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for flake8_mock_spec-1.0.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 37d9ac9a253eb26e78cbf18947464875dd62f9d81b17eb9b4908b5f00d4a5c68 |
|
MD5 | acd12801ef27ff4fc3abc5e37e8e5ae3 |
|
BLAKE2b-256 | a044441272f1fff3475c86ff95ebd1aa5c2eaa974f8e1de72ccf3c5e9306ddc4 |