A mocked deer :)

Mocking in Python Has Never Been Easier

This article assumes you already know your way around Python mocks and Pytest and that you’re familiar with the Arrange-Act-Assert pattern.
If you need a short recap, I find the following articles useful:
What the mock? A cheatsheet for mocking in Python
Arrange-Act-Assert: A Pattern for Writing Good Tests

I often struggle with Python mocks, this is why I wrote a library to assist me.

The Pytest Mock Generator library simplifies writing the ‘arrange’ and ‘assert’ sections. It generates the ‘arrange’ and ‘assert’ sections for you and allows you to focus on the ‘act’ section of your tests.

I’m sharing it with you, so it can save you time and effort.

Let’s assume you want to do some complex logic on a string and then write it to a zip file. Here is a short piece of code to do just that:

This is the function that you want to test (aka Unit Under Test or UUT). You don’t want to create a file on the hard drive and wish to mock it instead.

Here is where the mock generator (mg for short) fixture comes to play — it would generate both the arrange and assert sections for you.

An outline of the test method in an arrange-act-assert pattern looks like so:

Please note this line in particular: mg.generate_uut_mocks_with_asserts(process_and_zip). It receives the tested function as a parameter and does a static code analysis to mock the various dependencies of the function.

When you execute the test, the following output is printed to the console and copied to the clipboard:

This generated code is ready to use and can be embedded in your test:

The arrange part is complete and we’re left with filling the assert section. Luckily for us, this line would generate the assert section: mg.generate_asserts(mock_ZipFile, name=’mock_ZipFile’). Run the test function once more and you’ll get the asserts copied to the clipboard and printed to the console:

These asserts are the exact calls made to the mock we prepared earlier. They include the creation of the zip file, entering and exiting the context, and the call to create a file inside the zip and fill it with data.

Some of them are pretty low level, so I’m omitting them from the final version of the test function:

That’s it! We have done several great things in this article, so here is a short recap:

  • We have a beautiful test method in no time.
  • Most of the code was auto-generated.
  • The helper library allowed us to focus on the main code sections.
  • We have saved time and effort doing the above.
  • Mocking in Python has never been easier 😊

To get started, visit https://pypi.org/project/pytest-mock-generator/.

Did this tool save you some time? If so, let me know.

--

--

--

An engineer with a passion for technology. See more at https://www.linkedin.com/in/koganpeter

Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

1 Reason Why I’ll Never Hire a Developer Who ISN’T Self Taught

10 Reasons to Attend a Hackathon

Enemy Dodging Player Lasers

Learning regex with doggos

Implement UnitOfWork pattern and Implement with Generics!!

Bash scripts 101

How to Test the Connectivity Between Docker Container and the Host Machine Using Netcat

What is the page object model

pom,page object model,page object,page object model framework, testng, page object with java,page object model(pom)

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Peter Kogan

Peter Kogan

An engineer with a passion for technology. See more at https://www.linkedin.com/in/koganpeter

More from Medium

Dependency Injection in Python

The configuration schema using Pydantic

The Boilerplate for Logging in Python