Skip to main content

Utility which makes mocking more readable and controllable

Project description

pytest-when

Plugin provides a when fixture, which enables the following way of mocking the python objects:

(
    when(some_object, "attribute")
    .called_with(1, 2, when.markers.any)
    .then_return("mocked")
)

It is readable and gives you a way to enable the mock only for a specific argument's values. In this the attribute will be mocked, for specific first two arguments and any third argument.

Inspired by https://github.com/mockito/mockito-scala

.called_with method arguments are compared with the real callable signature and gives additional protection against changing the real callable interface.

Installation

pip install pytest-when

Usage

After installing the package a new fixture when will be available. See the following example how to use it:

# class which we're going to mock in the test
class Klass1:
    def some_method(
        self,
        arg1: str,
        arg2: int,
        *,
        kwarg1: str,
        kwarg2: str,
    ) -> str:
        return "Not mocked"


def test_should_properly_patch_calls(when):
    when(Klass1, "some_method").called_with(
        "a",
        when.markers.any,
        kwarg1="b",
        kwarg2=when.markers.any,
    ).then_return("Mocked")

    assert (
        Klass1().some_method(
            "a",
            1,
            kwarg1="b",
            kwarg2="c",
        )
        == "Mocked"
    )
    assert (
        Klass1().some_method(
            "not mocked param",
            1,
            kwarg1="b",
            kwarg2="c",
        )
        == "Not mocked"
    )

# if you need to patch a function
def test_patch_a_function(when):
    when(example_module, "some_normal_function").called_with(
        "a",
        when.markers.any,
        kwarg1="b",
        kwarg2=when.markers.any,
    ).then_return("Mocked")

    assert (
            example_module.some_normal_function(
                "a",
                1,
                kwarg1="b",
                kwarg2="c",
            )
            == "Mocked"
    )
    assert (
            example_module.some_normal_function(
                "not mocked param",
                1,
                kwarg1="b",
                kwarg2="c",
            )
            == "Not mocked"
    )

It is possible to use 'when' with class methods and standalone functions (in this case cls parameter will become a python module).

You can patch multiple times the same object with different "called_with" parameters in a single test.

You can also patch multiple targets (cls, method)

See more examples at: test_integration

Setup for local developement

Requirements:

  1. pdm https://pdm.fming.dev/latest/#installation
  2. python3.8 (minimum supported by a tool)
pdm install

To run tests and linters use:

make test
make lint

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

pytest_when-1.1.3.tar.gz (11.2 kB view details)

Uploaded Source

Built Distribution

pytest_when-1.1.3-py3-none-any.whl (9.7 kB view details)

Uploaded Python 3

File details

Details for the file pytest_when-1.1.3.tar.gz.

File metadata

  • Download URL: pytest_when-1.1.3.tar.gz
  • Upload date:
  • Size: 11.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: pdm/2.12.2 CPython/3.10.12

File hashes

Hashes for pytest_when-1.1.3.tar.gz
Algorithm Hash digest
SHA256 aa892b208745a4fbc0c3f0468b6bb6763e752cd4f0013ea454fca3f6f520d36e
MD5 fad1398343424143e7f9eb110a8c9c5b
BLAKE2b-256 ff9f26de77096201a3ef8ac07a5a1f52c0c8e2c1dc3b46786a149468f0df3ed1

See more details on using hashes here.

File details

Details for the file pytest_when-1.1.3-py3-none-any.whl.

File metadata

  • Download URL: pytest_when-1.1.3-py3-none-any.whl
  • Upload date:
  • Size: 9.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: pdm/2.12.2 CPython/3.10.12

File hashes

Hashes for pytest_when-1.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 046cf9bd96c636626565101161497ad917dd2f6d73c0575fa6af2a4b4c198760
MD5 14a52c15a3cc0e426e209076032562bc
BLAKE2b-256 1e49ea214360815e14b2e5e0b4a20726db801ca69e8ba26c5b015a81b2fa5d5a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page