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
- Setting up ANTLR4 on Windows
- Meritocracy?
- Possible Plagiarism Made me Cringe
- SQLite DB Migrations with PRAGMA user_version
- Using Plex with Nextcloud
Recent Favorite Blog Posts
This is a collection of the last 8 posts that I bookmarked.
- The Rise of Bluesky from Communications of the ACM
- Podcaster, DJ, and writer DJ Louie XIV on going for it (even if you’re terrified) from The Creative Independent
- Useful Bluesky Tools from Robb Knight • Posts • Atom Feed
- Re: Bluesky from Colin Devroe
- From the Red Hell to the Sky of Blue from Straphanger
- We don’t need to use what we make from Derek Sivers blog
- Ubuntu Summit 2024: A joyful experience filled with sorrow from Planet KDE | English
- Sabotage from jwz
Articles from blogs I follow around the net
13/12/2024
# I can't believe it's been over a month since the last post. Not very good for someone who's supposed to be back. Still, I've also been struggling to get back to making music again; I've had a couple of ideas and put them on SoundClou…
via Colin Walker - Daily Feed December 18, 2024Christmas with Grubbs – an animated holiday special I worked on that you and your kids will love.
I am part of an animated holiday special and you can watch it on YouTube for free! Christmas With Grubbs is an animated holiday special based on Max Weaver's comic. It's about a little boy and his imaginary friend who get into all sorts of mischie…
via WIL WHEATON dot NET December 17, 2024Businessweek: Crypto Got What It Wanted in November’s Election. Now What?
The industry is now in a position to weaken financial rules that might protect consumers from the next crypto crash.
via Citation Needed December 17, 2024Generated by openring