Skip to content
/ pybond Public

pybond is a spying and stubbing library for python, inspired by the clojure bond library.

Notifications You must be signed in to change notification settings

epgui/pybond

Folders and files

NameName
Last commit message
Last commit date

Latest commit

898f222 · Mar 3, 2024

History

28 Commits
Jan 23, 2023
Mar 3, 2024
May 15, 2023
Jul 12, 2023
Jan 24, 2023
Mar 3, 2024
Mar 3, 2024
Jan 23, 2023
Jan 23, 2023
Mar 3, 2024

Repository files navigation

pybond

Build codecov

pybond is a spying and stubbing library inspired heavily by the clojure bond library.

Installation

pip

pip install pybond==0.2.2

requirements.txt

pybond==0.2.2

pyproject.toml

pybond = "0.2.2"

Example usage

Let's say you wanted to test the functions in this module:

# /sample_code/my_module.py
from typing import Any

import sample_code.other_package as other_package


def foo(x: Any) -> None:
    response = other_package.make_a_network_request(x)
    other_package.write_to_disk(response)
    return response


def bar(x: Any) -> None:
    return foo(x)

With pybond you can easily spy on any given function or stub out functions that perform IO:

# /tests/test_my_module.py
from pybond import calls, called_with_args, spy, stub, times_called

import sample_code.other_package as other_package
import sample_code.my_module as my_module
from sample_code.my_module import bar


def test_foo_is_called():
    with spy(my_module.foo):
        assert times_called(my_module.foo, 0)
        bar(42)
        assert times_called(my_module.foo, 1)
        bar(42)
        bar(42)
        assert times_called(my_module.foo, 3)


def test_bar_handles_response():
    with stub(
        (other_package.make_a_network_request, lambda x: {"result": x * 2}),
        (other_package.write_to_disk, lambda _: None),
    ), spy(
        my_module.foo,
    ):
        assert times_called(my_module.foo, 0)
        assert times_called(other_package.make_a_network_request, 0)
        assert bar(21) == {"result": 42}
        assert times_called(my_module.foo, 1)
        assert times_called(other_package.make_a_network_request, 1)
        assert called_with_args(my_module.foo, args=[21])
        assert bar(20) == {"result": 40}
        assert calls(my_module.foo) == [
            {
                "args": [21],
                "kwargs": None,
                "return": {"result": 42},
                "error": None,
            },
            {
                "args": [20],
                "kwargs": None,
                "return": {"result": 40},
                "error": None,
            },
        ]
        assert calls(other_package.write_to_disk) == [
            {
                "args": [{"result": 42}],
                "kwargs": None,
                "return": None,
                "error": None,
            },
            {
                "args": [{"result": 40}],
                "kwargs": None,
                "return": None,
                "error": None,
            },
        ]

License

Distributed under the Eclipse Public License.

About

pybond is a spying and stubbing library for python, inspired by the clojure bond library.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages