Sealed Mock
Whitelist the attributes/methods of your mocks instead of just letting it create new mock objects.
sealedmock allows to specify when you are done defining the mock, ensuring that any unexpected call to the mock is cached.
Sample:
from unittest.mock import Mock
from sealedmock import seal
m = Mock()
m.method1.return_value.attr1.method2.return_value = 1
seal(m) # No new attributes can be declared
m.method1().attr1.method2()
# 1
m.method1().attr2
# Exception: AttributeError mock.method1().attr2
Big news! This is getting into Python3.7! See this PR.
Install
pip install sealedmock
Usage
Given you have a file like:
import urllib2
class SampleCodeClass(object):
"""This is sample code"""
def calling_urlopen(self):
return urllib2.urlopen("http://chooserandom.com")
def calling_splithost(self):
return urllib2.splithost("//host:port/path")
You can write a test like:
from unittest.mock import patch
from sealedmock import seal
@patch("tests.sample_code.urllib2")
def test_using_decorator(mock):
sample = sample_code.SampleCodeClass()
mock.urlopen.return_value = 2
seal(mock) # No new attributes can be declared
# calling urlopen succeeds as mock.urlopen has been defined
sample.calling_urlopen()
# This will fail as mock.splithost has not been defined
sample.calling_splithost()
If you use an common Mock the second part will pass as it will create a mock for you and return it. With sealedmock you can choose when to stop that behaviour.
This is recursive so you can write:
@patch("sample_code.secret")
def test_recursive(mock):
sample = sample_code.SampleCodeClass()
mock.secret.call1.call2.call3.return_value = 1
seal(mock) # No new attributes can be declared
# If secret is not used as specified above it will fail
# ex: if do_stuff also calls secret.call1.call9
sample.do_stuff()
It also prevents typos on tests if used like this:
@patch("sample_code.secret")
def test_recursive(mock):
sample = sample_code.SampleCodeClass()
sample.do_stuff()
seal(mock)
mock.asert_called_with(1)
# Note the typo in asert (should be assert)
# A sealed mock will rise, normal mock won't
Metadata
Release files for sealedmock 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| sealedmock-1.0.1.tar.gz | 3.7 kB | Without provenance | Details |
Release files / sealedmock-1.0.1.tar.gz
| Download URL | sealedmock-1.0.1.tar.gz |
|---|---|
| Size | 3.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1e6459faa3de1d002fa7c43b493d1beccc1897c3926a8e882bee962463119717
|
|
BLAKE2b-256 checksum How to use checksums |
50042670a1fe34c3847fe861645a22afae39845b62383b3a736cb44c43f40135
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
Security for sealedmock 1.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.