It seems to me that Microsoft still doesn’t quite understand the serious TDD culture. I recently saw an InfoQ article entitled VS11 Gets Better Unit Testing Tools, Fakes Framework. My assumption is that the word “better” in that title applies only to the unit testing tools, not the fakes framework.
Although, I like that Microsoft has, for a while now, recognized the existence of the testing community and that they are trying to improve their tools to fit that need, it seems that they often miss important details. Admittedly, this is beta, and I only know as much about their fakes framework as I’ve read in that article and links from that article, however, it seems from what I read that they are not including mocks in their fakes framework. They have stubs, and what they are calling “shims”. Shims essentially allow you to provide delegates to operate in place of the actual method calls on the object you are faking, so kinda like stubs but more like a fake since you can actually provide a method that executes so you can do more stuff than just specify a return value. This would be great, except that it is completely unnecessary and I think it is going to lead to some awful, spaghetti-like test code.
The other problem I see with shims, if I am understanding how they are implemented, is that you use Visual Studio to generate your shim classes. On a side note, I was very happy to see they are deprecating private accessors, but it seems that shims are going to have a lot of the same problems. For example, if I am coding against a shim and I decide I don’t like the name of a method on the object I am shimming, I’ll want to refactor it right there. I fear that, just like private accessors, if I refactor a shim, I am only refactoring the shim, not the real class, and so shims are going to be an obstruction to refactoring, just like private accessors are.
If Microsoft wants to include a fakes framework in VS, I don’t understand why they don’t embrace what is already working well in the TDD community. Fakes frameworks such as RhinoMocks and Moq already give you what you need and they both embrace the Arrange-Act-Assert approach which leads to much cleaner tests. With Arrange-Act-Assert you setup your test at the top of your test (arrange), then make the call to the system under test (act), and then you do all your assertions. By not including mocks, the VS11 fakes framework will cause people to have to do assertions as part of the arrange phase of their tests as suggested in the InfoQ article when the author stated, “Mocks are missing, but you can do assertions within the stub method implementations.”
Perhaps the most frustrating thing about this new fakes framework is that we will have lots of people, who are earnestly trying to learn how to do TDD, and they will learn that shims are the right thing to do and they will have no understanding of a true mock. That means that, even though I can just ignore the existence of the new fakes framework myself, developers everywhere will start doing things the Microsoft way and someday I’ll have to work on some code somewhere that uses shims instead of something more reasonable because they have embraced the new framework.
In my opinion, this is another failed Microsoft attempt to emulate what the rest of the development world has already figured out.