Я бы порекомендовал преобразовать то, что у вас есть, во что-то вроде этого:
public class MyClass()
{
private IHelper _helper;
public MyClass()
{
//Default constructor normal code would use.
this._helper = new Helper();
}
public MyClass(IHelper helper)
{
if(helper == null)
{
throw new NullException(); //I forget the exact name but you get my drift ;)
}
this._helper = helper;
}
public void LoadData()
{
SomeProperty = this._helper.GetSomeData();
}
public object SomeProperty {get;set;}
}
Теперь ваш класс поддерживает так называемое внедрение зависимостей. Это позволяет вам внедрить реализацию вспомогательного класса и гарантирует, что ваш класс должен зависеть только от интерфейса. Когда вы имитируете это, вы просто создаете имитатор, который использует интерфейс IHelper, и передаете его конструктору, и ваш класс будет использовать его, как будто это настоящий класс Helper.
Теперь, если вы застряли, используя класс Helper в качестве статического класса, я бы посоветовал вам использовать шаблон прокси / адаптера и обернуть статический класс другим классом, поддерживающим интерфейс IHelper (который вам также потребуется создать ).
Если в какой-то момент вы захотите сделать этот шаг дальше, вы можете полностью удалить стандартную реализацию Helper из пересмотренного класса и использовать контейнеры IoC (Inversion of Control). Если это новость для вас, я бы рекомендовал сначала сосредоточиться на основах того, почему все эти дополнительные хлопоты стоят того времени (это ИМХО).
Ваши юнит-тесты будут выглядеть примерно так: псевдо-код:
public Amazing_Mocking_Test()
{
//Mock object setup
MockObject mockery = new MockObject();
IHelper myMock = (IHelper)mockery.createMockObject<IHelper>();
mockery.On(myMock).Expect("GetSomeData").WithNoArguments().Return(Anything);
//The actual test
MyClass testClass = new MyClass(myMock);
testClass.LoadData();
//Ensure the mock had all of it's expectations met.
mockery.VerifyExpectations();
}
Не стесняйтесь комментировать, если у вас есть какие-либо вопросы. (Кстати, я понятия не имею, работает ли весь этот код, я просто набрал его в своем браузере, я в основном иллюстрирую концепции).