Consider the following piece of code:
It’s a contrived example that just reads an item of data from a DynamoDB table. How would you write a unit test for the
There’s couple of things to note here.
First, I’m using the wonderful scope functionality of pytest fixtures. This allows me to create a new fixture per every test function execution. It is necessary for Stubber to work correctly.
The Stubber needs to be created with the correct client. Since I’m using a DynamoDB Table instance in
models.py, I have to access its client when creating the Stubber instance.
Notice also the “verbose”
get_item_response structure in the first test. That’s because of how the DynamoDB client interacts with DynamoDB API (needless to say, this is DynamoDB specific). The Table is a layer of abstraction on top of this, it converts between DynamoDB types and Python types. However it still uses the client underneath, so it expects this structure nevertheless.
Finally, it’s good practice to call
assert_no_pending_response to make sure the tested code actually did make the call to an AWS service.
I really like this combination of pytest and Stubber. It’s a great match for writing correct and compact tests.