I downloaded TypeMock Isolator yesterday - so whatever version is currently available on your website...
Sorry for the lengthy code, but you asked for it :)
The following code is not exactly the code I'm working with, but it's self-contained and represents what I want to see when my code runs. This code can be pasted into Snippet Compiler and executed ( provided you've set it up with TypeMock (
http://www.paraesthesia.com/archive/2008/02/21/template-for-quick-typemock-testing.aspx ) ):
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using NUnit.Framework;
using TypeMock;
using TypeMock.ArrangeActAssert;
[TestFixture]
[VerifyMocks]
public class MyTestFixture
{
[Test]
public void MyTest()
{
IMyAddressUseCase mockUseCase = SingletonUseCase.Instance;
MyAddressObject returnAddressObject = new MyAddressObject();
returnAddressObject.StreetAddress = "123 Main Street";
returnAddressObject.City = "Anytown";
returnAddressObject.State = "CA";
Isolate.WhenCalled( () => mockUseCase.ProcessAddress( "123 Main Street", "Anytown", "CA", out returnAddressObject ) ).WithExactArguments().
WillReturn( MyAddressUseCaseStatus.Success );
ACallingClass callingClass = new ACallingClass();
MyAddressObject resultantObject = callingClass.CallTheUseCase( "123 Main Street", "Anytown", "CA" );
Assert.IsNotNull( resultantObject, "ResultantObject is NULL" );
Assert.AreEqual( "123 Main Street", resultantObject.StreetAddress );
}
}
public class SingletonUseCase
{
private static IMyAddressUseCase instance;
private SingletonUseCase() {}
public static IMyAddressUseCase Instance
{
get
{
if ( instance == null )
{
instance = Isolate.Fake.Instance<IMyAddressUseCase>();
}
return instance;
}
}
}
public class MyAddressObject
{
public string StreetAddress { get; set; }
public string City { get; set; }
public string State { get; set; }
}
public enum MyAddressUseCaseStatus
{
Success,
Failure
}
public interface IMyAddressUseCase
{
MyAddressUseCaseStatus ProcessAddress( string streetAddress,
string city, string state, out MyAddressObject myAddressObject );
}
public class MyAddressUseCase : IMyAddressUseCase
{
public MyAddressUseCaseStatus ProcessAddress( string streetAddress,
string city, string state, out MyAddressObject myAddressObject )
{
myAddressObject = new MyAddressObject();
myAddressObject.City = city;
myAddressObject.State = state;
myAddressObject.StreetAddress = streetAddress;
return MyAddressUseCaseStatus.Success;
}
}
public class ACallingClass
{
public MyAddressObject CallTheUseCase( string streetAddress,
string city, string state )
{
IMyAddressUseCase useCase = SingletonUseCase.Instance;
MyAddressObject myAddressObject = null;
MyAddressUseCaseStatus status = useCase.ProcessAddress( streetAddress,
city, state, out myAddressObject );
if ( status == MyAddressUseCaseStatus.Success )
return myAddressObject;
return null;
}
}