Incremental development with Monorail: Part Seven
Since our last installment I slipped in a ninja-edit to one of the configuration files. This was to ensure that our sole service was marked as transient rather than the default Windsor lifestyle of singleton. This was pointed out to me by an eagle-eyed commenter and was an oversight on my part. So we’re now at rev10 and ready to roll once again!
In our last post we tidied up a few bits and improved our code-base rather than actually adding features as such. This time we’re going to move down into the persistence and start to drive out this notional layer.
We’re going to handle data access using the repository pattern. The repositories will work on our ActiveRecord entities ensuring they’re persisted to our database. We will introduce a new interaction between our service BlogPostService and the newly introduced repository interface IBlogPostRepository. Let’s get on and write a test:
The test above is fairly self-explanatory. We’ve introduced the IBlogPostRepository and we’re passing it into our BlogPostService which should then call the Save method passing our mapped post. We need to get rid of the red code and get the test passing, so first we must create our new interface, and then modify the service constructor:
We need to modify our other tests that construct the BlogPostService as they’re still assuming only a single argument constructor exists. As we have some duplication going on we’ll push this construction up into our setup code:
We should be able to run our tests in this fixture now:
As expected, since our BlogPostService doesn’t actually do much with our repository yet, we need to do some pretty minor tweaking to pass this test:
Let’s try again now:
The integration tests are failing as we’ve yet to map the new dependency in our Windsor configuration. We can specify this now:
We still have failing integration tests though, so we need to add the BlogPostRepository specified in our configuration:
As you can see it doesn’t do much, but we just want our tests passing at this stage. Let’s run the whole suite of tests now:
Great, we have a working product once more. I’m going to finish here, as ever, the latest changes have been committed:
Next time we’ll make our new repository more useful and finally hit the database!