Python Mocks Test Helpers
I’ve been writing a python wrapper for the CircleCI API over the last week. I wanted to do this “the right way” with test driven development.
I have a couple integration tests that actually hit the CircleCI API, but most of the unit tests so far are using MagicMock to ensure that the basic functions are working as expected.
This generally involves the tedious process of dumping out JSON, saving it to a file, and then reloading that file later on to actually test it.
I wrote two helper functions that make this process slightly less tedious.
Load Mock
The first is a function that loads a file and overrides every request to return that file (typically as JSON).def loadMock(self, filename): """helper function to open mock responses""" filename = 'tests/mocks/{0}'.format(filename)with open(filename, 'r') as f: self.c._request = MagicMock(return_value=f.read())
Test Helper
The second is a function that runs a real request for the first time and dumps the output to a file.def test_helper(self): resp = self.c.add_circle_key() print(resp) with open('tests/mocks/mock_add_circle_key_response', 'w') as f: json.dump(resp, f)
test_helper
allows it to be picked up and ran when you run your test suite since by default unittest will capture any methods that start with test
.
Usage
An actual example is shown below.def test_clear_cache(self): self.loadMock('mock_clear_cache_response') resp = json.loads(self.c.clear_cache('levlaz', 'circleci-sandbox'))self.assertEqual('build dependency caches deleted', resp['status'])
test_helper
and verify that the contents are what we expect them to be.
This approach has been working very well for me so far. One thing to keep in mind with writing these types of tests is that you should also include some general integration tests against the API that you are working with. This way you can catch any regressions with your library in the event that the API changes in any way. However, as a basic sanity check mocking these requests is a good practice and less prone to flakiness.
Thank you for reading! Share your thoughts with me on bluesky, mastodon, or via email.
Check out some more stuff to read down below.
Most popular posts this month
- 2024
- Reinstalling Windows at 1am
- SQLite DB Migrations with PRAGMA user_version
- My Custom Miniflux CSS Theme
- How to Disable Wayland in Debian Testing
Recent Favorite Blog Posts
This is a collection of the last 8 posts that I bookmarked.
- Underused Techniques for Effective Emails from Refactoring English
- Death by a thousand slops from daniel.haxx.se
- The AGI economy is coming faster than you think from Freethink
- Rolling the ladder up behind us from Xe Iaso's blog
- In Praise of “Normal” Engineers from charity.wtf
- Reports of Bluesky's death have been greatly exaggerated from The Torment Nexus
- What Would a Kubernetes 2.0 Look Like from matduggan.com
- We Can Just Measure Things from Armin Ronacher's Thoughts and Writings
Articles from blogs I follow around the net
Occupation and Preoccupation
Here’s Jony Ive in his Stripe interview: What we make stands testament to who we are. What we make describes our values. It describes our preoccupations. It describes beautiful succinctly our preoccupation. I’d never really noticed the connection between th…
via Jim Nielsen’s Blog July 17, 2025What do we do when the facts don't matter?
As a journalist by training, I have what you might call an addiction to facts. I believe that there are things that are true and things that are not, and that we can determine one from the other through observation, rational thought, and meticulous resear…
via The Torment Nexus July 17, 2025Back to the Future
This past weekend, I decided to take a trip down memory lane and take a look at the evolution of this blog’s design over the years (with a little help from the Wayback Machine). While I’ve really enjoyed the challenge of making an obsessively backwards co…
via flower.codes July 17, 2025Generated by openring