In this post, I would like to share with you some experiences I had in my last project and give you advice on what you can use to write Unit Tests and why sometimes some of the libraries are not a good way to go.
In the most cases when the team is thinking to start writing unit tests there is an discussion about different approaches and available libraries – been there done that.
Let me tell you my story
In our case, we had the following libraries taken into consideration:
- NUnit vs XUnit
- NSubstitute vs Moq
- Asserts vs FluentAssertions
We totally forgot about AutoFixture and that was our mistake!
After couple of meetings (we had several teams that had to agree something) we decided to vote and the winners were:
Of course, you may ask “why” … the answer is usually simple because team members knew these three or just liked to write unit tests with the support of these libraries than others.
Is this logical – in some way yes. Is it professional – some people may say ‘no’ but this is how real-world works. Software developers tend to use libraries that they know – especially when it comes to writing unit tests – even when there are better solutions out there.
Everything was fine at the beginning…
We started to write tests, we had around 100 test cases and then we realized that we need something to generate fake Sitecore items automatically.
We started to play we AutoFixture library and then we realized that we made a mistake …
AutoFixture was working really good with all of the libraries instead of FakeDB. We were able to generate simple types like strings etc. but no items were added to the FakeDB.
After some digging in google I found out that many people had that issue and there are two repeated solutions:
- switch into XUnit
- get rid of FakeDB and prepare your own fake objects
For us was too late – we decided to stay with our setup.
What to use – the answer
Based on my experience I would not start writing unit tests for Sitecore with NUnit in the future.
The rest of the listed libraries seem to be pretty safe and good from my point of view.
So the answer is:
Use XUnit and whatever else you want – but not NUnit because it can block you at some point as blocked me.