To globally mock functions in python


In one of the python projects I am working on we have this central method to publish events to pubsub. We wanted to have a global mock of pubsub to avoid having to explicitly mocking it many places. Turns out this is possible with a wrapper function and pytest fixtures:

def _publish_pubsub_event(topic: str, message: PubSubMessage) -> None:
PubSubPublisher(settings.GCLOUD_PROJECT, topic).publish(message)
def publish_pubsub_event(topic: str, message: PubSubMessage) -> None:
return _publish_pubsub_event(topic, message)

The publish_pubsub_event gets imported everywhere so to mock it we need to mock it in the context is being used, but the _publish_pubsub_event is not being used anywhere else than here so we can mock it in the context of this file.

In the module level conftest.py there is a fixture with autouse=True and it mocks the _publish_pubsub_event and returns the mock so that the fixture can be loaded explicitly to assert that the mock was called in the cases we want to verify the messages sent.

def mock_pubsub_publish(mocker: MockerFixture):
return mocker.patch("app.pubsub._publish_pubsub_event")