In this example I will show how to create a Unit Test with TypeMock.
First I have created some basic dummy classes for the example
public sealed class ServiceFactory { public static ExpireDateService CreateExpireDateService() { ExpireDateService expireDateService = new ExpireDateService(); expireDateService.administration = new SqlAdministration("connectionstring"); return expireDateService; } } /// <summary> /// SqlAdministrion creates connection and managed queries with SQL /// </summary> public class SqlAdministration { private static DateTime LoadParameterPrivate() { return DateTime.Parse("01-01-1980"); } public SqlAdministration(string connectionString) { //Create connection to sql� } public static DateTime LoadParameter(string expireDateType) { //GET expireDate from Database: SqlAdministratie.LoadParameter("expireDateType"); // Load Date from Private method for other mocking examples return LoadParameterPrivate(); } } public class ExpireDateService { public SqlAdministration administration; public DateTime GetDate(string expireDateType) { DateTime expireDate = SqlAdministration.LoadParameter(expireDateType); return expireDate; } } public class CheckDate { public static bool CheckExpireDateBooking() { ExpireDateService expireDateService = ServiceFactory.CreateExpireDateService(); DateTime expireDate = expireDateService.GetDate("expireDateDateFirst"); return DateTime.Parse("01-01-2000") < expireDate; } }
With the following Unit test I will test the code written above. I don't want to change my code or add code for testing purpose. That's where Mocking comes in. With TypeMock I will mock the outcome of specified methods.
The first example is a standard unit test. No Mocking there.
[code language='c#']
///
/// with a hardcoded date 01-01-2000
///
[TestMethod()]
public void TestMethodWithoutTypeMock()
{
Assert.IsFalse(CheckDate.CheckExpireDateBooking());
}
[/code]
Now I want to mock the method GetDate to return a date specified by me (01-01-2010).
/// <summary> /// Checks the expiredate from database (01-01-1980) /// with a hardcoded date provided by TypeMock (01-01-2010) /// </summary> [Isolated] [TestMethod()] public void TestMethodWithTypeMockIsolate() { //Create a dummy version of the ExpireDateService object to use for Mocking ExpireDateService expireDateService = new ExpireDateService(); expireDateService.administration = new SqlAdministration("dummyConnectionString"); //Return the declared expireDateService when method CreateExpireDateService is called Isolate.WhenCalled(() => ServiceFactory.CreateExpireDateService()) .WillReturn(expireDateService); //Isolate the call to method expireDateService.GetDate with parameter 'expireDateDateFirst' and return 01-01-2010 Isolate.WhenCalled(() => expireDateService.GetDate("expireDateDateFirst")) .WillReturn(DateTime.Parse("01-01-2010")); Assert.IsTrue(CheckDate.CheckExpireDateBooking()); }
For the latest example I wanted to Mock a Private method.
/// <summary> /// Checks the expiredate from database (01-01-1980) /// with a hardcoded date provided by TypeMock on privatemethod(01-01-2010) /// </summary> [Isolated] [TestMethod()] public void TestMethodWithTypeMockIsolatePrivate() { Isolate.NonPublic.WhenCalled(typeof(SqlAdministration), "LoadParameterPrivate") .WillReturn(DateTime.Parse("01-01-2010")); Assert.IsTrue(CheckDate.CheckExpireDateBooking()); }
You can download the source here:
MockingWithTypeMockExampleSource.zip (44.47 kb)
Hope it helps.
Cheers,
Pieter