Master unit testing C# code with NUnit and Moq: all about dependency injection, best practices and pitfalls to avoid