Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Writing Unit Tests for method that queries database

I am learning TDD and I currently have a method that is working but I thought I'd have a go at rebuilding it using TDD.

The method essentially takes 6 parameters, queries a database, does some logic and returns a List<T>

My initial tests including checking for empty/zero defined string and int method parameter values but now I'm not sure what to do. If I wasn't using TDD, I would just create code to find the DB connection string and open up a DB connection, query the database, read the values etc.

Obviously we can't do that in Unit Testing so I was after some advice of how to proceed.

like image 999
Jon Avatar asked Jan 25 '12 12:01

Jon


1 Answers

Remember that TDD is as much about good design than it is about testing. This method has too much going on; it violates the Separation of Concerns principle.

You've already identified several areas that will need to be tested:

The method essentially takes 6 parameters, queries a database, does some logic and returns a List<T>

You have several discrete steps there, and there are probably a few more hiding in the code. Breaking those up is the name of the game when it comes to TDD.

For starters, it might be a good idea to factor out the piece that performs the logic.

Is your method building a query dynamically? Break that piece out as well and test it to make sure the query is written properly.

You can put the execution of the query into a standalone repository or something similar, and write integration tests against that. That way you only have a simple test hitting the database instead of the current complex method.

If you try to test this as is, you'll likely end up with a monster test that requires a lot of setup and duplicates all of your business logic, and when it breaks it'll be unclear as to what went wrong.

like image 168
Josh Earl Avatar answered Oct 12 '22 13:10

Josh Earl