After I finished last article, I started to think that there should be another way to test the non-virtual methods of a class. And, as a matter of fact, there is another way that has been around for a long time: Microsoft Fakes. If your don't know it, you can read this article.
While I wouldn't recommend it for using in your daily testing, it's invaluable when you are testing legacy code and don't have any testing and lots of coupling in your code. The usage is very simple:
In the Solution Explorer of the test project, right-click in the dll you want to create a fake (in our case, is the dll of the main project and select Add Fakes Assembly:
That will add the fake assembly and all the infrastructure needed to use fakes in your tests. Then, in your test class, you can use the newly created fake. Just create a ShimContext and use it while testing the class:
[TestMethod]
public void TestVirtualMethod()
{
using (ShimsContext.Create())
{
var fakeClass = new Fakes.ShimClassNonVirtualMethods();
var sut = new ClassToTest();
sut.CallNonVirtualMethod(fakeClass);
}
}
[TestMethod]
public void TestNonVirtualMethod()
{
using (ShimsContext.Create())
{
var fakeClass = new Fakes.ShimClassNonVirtualMethods();
var sut = new ClassToTest();
sut.CallNonVirtualMethod(fakeClass);
}
}
As you can see, we initialize a ShimsContext and enclose it in an Using clause. Then we initialize the fake class. This class will be in the same namespace as the original one, with .Fakes at the end, and its name will be the same, starting with Shim. That way, we can use it as a fake for the original class and it will have all non-virtual methods overridden.
That feature, although not recommended in a daily basis, can be a lifesaver when you have to test legacy code with deep coupling with databases, UI, or even other libraries. Microsoft Fakes can fake almost everything, including System calls, so it can be a nice starting point to refactor your legacy code - with it, you can put some tests in place and start refactoring your code more confidently.