In the following video, you will see a graph and how in time we expand the code using the Outside-in TDD
Requirements
We have an web API where we should be able to write and read articles and their comments.
Acceptance Test
We save an article:
POST /api/1/save/Article
{
"title":"New article",
"content":"The content"
}
and we receive the article + id
{
id: 13, - can be any value
title:"New article",
content:"The content"
}
We then add 2 new comments:
POST /api/1/save/Article
{
id: 13, - can be any value
comments:[
{"comment":"This was awesome!"},
{"comment":"I loved it as well!"},
]
}
response:
{
id: 13, - can be any value
title:"New article",
content:"The content"
}
and now reading the articles and the comments:
POST api/1/query/Article
{
find: [id,title,content,{comments:[id,comment]}],
where:{id:13}
}
should return
{"13":{
id: 13, - can be any value
comments:{
"113":{"comment":"This was awesome!"},
"114":{"comment":"I loved it as well!"},
}
}
}
Outside-In TDD approach
Unlike classicist TDD, in Outside-In, you start the code from the outside, designing it along the way. You start with an acceptance test, then with the unit/integration tests and code needed until you make the acceptance test work:
So let's begin:
Step 1: Acceptance test
When we run it:
2. Step 2 moving in,
From the outside, writing the first test for the service that will handle the url. A little bit of design, while writing the test: we consider, that we will use a function that will get the object from the database if we have an id in the json or will give us a brand new Article object if we have no id in the json.
Now if we properly do the code, the test will pass:
Step 3: moving furher in, database_services and get_database_object
However, we did not implement the get_database_object, which will work with the database. So for that we'll write the tests first:
or:
and
Now let's write the code to make it pass:
We write in fact 2 tests to cover both scenarios: when editing or when adding a new article.
Step 4: now we move back and extend the api
We design it to read the data from json and transfer it to the database object. For that we'll use a function transfer_from_json
Once it passes, we move further:
Step 5: writing the transfer service
Now we make the test pass:
Step 6: back to extending the api
We now need to save the object with the data from the json into the db
For this, we extend the test:
and make it pass, then we move back to implementing using TDD the save_database_object
Step 7 extending the database_service to also save
Once we write the test, the code and make it pass:
we move back to the api
Step 7 extend the api
Step 8: TDD the extension:
Until we make it pass:
After a few more intermediary steps:
...
We will TDD all the necessary code to make the acceptance test pass: