あなたが持っているものを次のように変換することをお勧めします:
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 インターフェイスを使用するモックを作成してコンストラクターに渡すだけで、クラスはそれを実際のヘルパー クラスであるかのように使用します。
ヘルパー クラスを静的クラスとして使用することに行き詰まっている場合は、プロキシ/アダプター パターンを使用し、静的クラスを IHelper インターフェイスをサポートする別のクラス (これも作成する必要があります) でラップすることをお勧めします。
ある時点でこれをさらに一歩進めたい場合は、改訂されたクラスからデフォルトのヘルパー実装を完全に削除し、IoC (制御の反転) コンテナーを使用できます。ただし、これが初めての場合は、最初に、この余分な手間がすべて価値がある理由の基本に焦点を当てることをお勧めします (それは私見です)。
単体テストは、次の疑似コードのようになります。
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();
}
ご不明な点がございましたら、お気軽にコメントしてください。(ちなみに、このコードがすべて機能するかどうかはわかりません。ブラウザに入力しただけです。主に概念を説明しています)。