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;
}
} /// /// SqlAdministrion creates connection and managed queries with SQL /// 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.
/// /// Checks the expiredate from 'database' 01-01-1980 /// with a hardcoded date 01-01-2000 /// \[TestMethod()\] public void TestMethodWithoutTypeMock() {
Assert.IsFalse(CheckDate.CheckExpireDateBooking());
}
Now I want to mock the method GetDate to return a date specified by me (01-01-2010).
/// /// Checks the expiredate from database (01-01-1980) /// with a hardcoded date provided by TypeMock (01-01-2010) /// \[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.
/// /// Checks the expiredate from database (01-01-1980) /// with a hardcoded date provided by TypeMock on privatemethod(01-01-2010) /// \[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