There
are many testing frameworks available (both commercial and free). The
most
commonly
used frameworks are xUnit family of frameworks, most notably NUnit,
xUnit.net, and MbUnit. Nunit is most widely used as it has been
available longer in market and because of its extensibility (it
supports plug-ins). We can easily download any of these frameworks
from NuGet (http://nuget.org). Visual
Studio allows us to use any of these frameworks within the IDE. So,
that we have a familiar interface to work with.
In
addition to basic testing frameworks, there are also mocking
frameworks, purpose of which is to provide mock
objects. Mock objects simulate the functionality of real
objects. With mock objects w can simulate nonexistent functionality
and external resources. It provides means to write unit test
following the principle of isolation.
There
are many mocking frameworks available free such as Moq, Nunit.Mocks
and RhinoMocks. We can download any directly from NuGet. Some of the
commercial ones are JustMock from Telerik (http://bit.ly/JustMock)
and Isolator from Typemock (http://bit.ly/TypemockIsolator).
Microsoft Test Framework has a feature called Fakes
which is equivalent of the mock object.
We
generally use Microsoft Test Framework as it is included in Visual
Studio and does not require any setup or configuration. But not all
the features of Microsoft Test Framework are
available
in all versions of Visual Studio. For example, Fakes feature to
create mocking objects is available in Visual Studio 2012 Premium and
Ultimate. That's why, for mocking objects, we use a mocking framework
called Moq.
Moq
Introduction
Moq
is a mocking framework which very simple and easy to use. It has no
dependency and we just need Moq.dll. It is open source and free too.
We can use it in all editions of Visual Studio including the free
ones.
Moq
was designed to take advantage of C# 3.0 but it works very well with
the most recent version of C# too. It supports mocking interfaces and
classes both. Internally, Moq uses Castle DynamicProxy
(http://bit.ly/DynamicProxy)
as a mechanism to enable mocking. Which means DynamicProxy helps Moq
to create .NET proxy on-the-fly at run time. Using this proxy Moq is
able to intercept objects without modifying code of class. Once Moq
intercepts the object, it can determine its behavior and it can add
functionality to the object without modifying code of the object.
By
using proxy mechanism mock objects is simple and fast but it has a
some limitation: If both interfaces and classes are proxied
then only virtual members
can be intercepted and mocked. In other words, if we have static
classes or members then they can not be mocked with Moq.
Setting
Up Moq
Easy
way to set up Moq in our application is to install it via NuGet. To
open NuGet, go to Tools => Library
Package Manager => Manage
NuGet Packages for Solution as shown in Figure 1:
Figure
1. Opening the NuGet Package Manager
Once
NuGet Package Manager window is opened, type moq
in
the search box and results will appear as shown
in Figure 2:
Figure
2. Installing Moq from NuGet
Click
on “Install” button for Moq. In the Select Projects dialog that
opens, check the box for the Tests
project as shown in Figure 3 and click “OK” and it will set up
Moq in our test project and we now ready to use it.
Figure
11-3. Selecting the project in which to
install Moq
Benefits
of Unit Testing
Following
are the main benefits of using unit testing:
• Finds
problems early: Well
written unit tests enables you to easily and quickly pinpoint
problems
of the code early in development process. It is particularly true
when
implementing
test driven development (TDD). With TDD we first write test cases and
then write code to pass the tests.
• Facilitates
change: Unit test
helps to ensure that any future changes in the code do not break
application. If any change cause a test to fail then the test failure
will give us a clear pointer where we need to fix the code.
• Simplifies
integration: As unit
test focuses on testing small pieces of code and for testing
complete
module becomes easier - we know that at least the components of the
module work properly.
• Provides
documentation: Unit
test provides nice source of documentation about functionality of the
application. So, naming the classes and unit tests correctly becomes
increasingly important.
No comments:
Post a Comment