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: TMS010 unittest.mock.Mock instances should be constructed with the spec or spec_set argument, more information: https://github.com/jdkandersson/flake8-mock-spec#fix-tms010
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:
TMS010
: checks thatunittest.mock.Mock
instances are constructed with thespec
orspec_set
argument.TMS011
: checks thatunittest.mock.MagicMock
instances are constructed with thespec
orspec_set
argument.TMS012
: checks thatunittest.mock.NonCallableMock
instances are constructed with thespec
orspec_set
argument.TMS013
: checks thatunittest.mock.AsyncMock
instances are constructed with thespec
orspec_set
argument.TMS020
: checks thatunittest.mock.patch
is called with any one or more of thenew
,spec
,spec_set
,autospec
ornew_callable
arguments
Fix TMS010
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 TMS011
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)
Fix TMS012
This linting rule is triggered by creating a unittest.mock.NonCallableMock
instance without the spec
or spec_set
argument. For example:
from unittest import mock
def test_foo():
mocked_foo = mock.NonCallableMock()
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.NonCallableMock(spec=Foo)
from unittest import mock
from foo import Foo
def test_foo():
mocked_foo = mock.NonCallableMock(spec_set=Foo)
Fix TMS013
This linting rule is triggered by creating a unittest.mock.AsyncMock
instance
without the spec
or spec_set
argument. For example:
from unittest import mock
def test_foo():
mocked_foo = mock.AsyncMock()
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.AsyncMock(spec=Foo)
from unittest import mock
from foo import Foo
def test_foo():
mocked_foo = mock.AsyncMock(spec_set=Foo)
Fix TMS020
This linting rule is triggered by calling unittest.mock.patch
without any one
or more of the new
, spec
, spec_set
, autospec
or new_callable
arguments. For example:
from unittest import mock
@mock.patch("Foo")
def test_foo():
pass
with mock.patch("Foo") as mocked_foo:
pass
foo_patcher = patch("Foo")
This example can be fixed by using any one or more of the new
, spec
,
spec_set
, autospec
or new_callable
arguments:
from unittest import mock
from foo import Foo
@mock.patch("Foo", spec=Foo)
def test_foo():
pass
with mock.patch("Foo", spec_set=Foo) as mocked_foo:
pass
foo_patcher = patch("Foo", autospec=True)
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.2.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e7a078ce0fd6bbd6d9e003cb7823c460c44c1a2778d48d6bc8640bae39814195 |
|
MD5 | 881f059ba72268644b1b0f45fb0fee30 |
|
BLAKE2b-256 | eb5e1a3ee9f835ee40098ff22a34488acd15b9f3a2b458e44575e9d98d2b2c66 |