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
- Great Lakes, Illinois
- Ladybird on Debian Stable
- My Custom Miniflux CSS Theme
- SQLite DB Migrations with PRAGMA user_version
- 2025
Recent Favorite Blog Posts
This is a collection of the last 8 posts that I bookmarked.
- Pluralistic: bunnie's piggyback hack (09 Jan 2026) from Pluralistic: Daily links from Cory Doctorow
- Clicks Communicator from Chris Hannah
- A Year Of Vibes from Armin Ronacher's Thoughts and Writings
- Pluralistic: A perfect distillation of the social uselessness of finance (18 Dec 2025) from Pluralistic: Daily links from Cory Doctorow
- Moving from WordPress to Substack from charity.wtf
- Grow, Like a Tree Not a Cancer from Jim Nielsen’s Blog
- Pluralistic: All the books I reviewed in 2025 (02 Dec 2025) from Pluralistic: Daily links from Cory Doctorow
- DEP-18: A proposal for Git-based collaboration in Debian from Optimized by Otto
Articles from blogs I follow around the net
Pluralistic: bunnie's piggyback hack (09 Jan 2026)
Today's links bunnie's piggyback hack: An actual "one weird trick" that's pretty fucking spectacular. Hey look at this: Delights to delectate. Object permanence: "Keyboard Practice"; Sam Bulte says she's no dirtier than oth…
via Pluralistic: Daily links from Cory Doctorow January 9, 202688x31 Button Curios
A smattering of links and resources related to 88x31 buttons
via Robb Knight • Posts • Atom Feed January 9, 2026Bix Frankonis
This week on the People and Blogs series we have an interview with Bix Frankonis, whose blog can be found at bix.blog. Tired of RSS? Read this in your browser or sign up for the newsletter. The People and Blogs series is supported by…
via Manuel Moreale — Everything Feed January 9, 2026Generated by openring