私は第三者のコンポーネントを使用しています。このコンポーネントは、アプリケーションにコンテキストのシングルトンパターンを提供します。私はこのシングルトンを私の側で使っていますが、私はこのオブジェクトを私のテストのために模擬したいと思います。このオブジェクトのモックを達成する方法はありますか?シングルトン付きのサイコモック
また、コンストラクタはprivateと宣言されています。
私は第三者のコンポーネントを使用しています。このコンポーネントは、アプリケーションにコンテキストのシングルトンパターンを提供します。私はこのシングルトンを私の側で使っていますが、私はこのオブジェクトを私のテストのために模擬したいと思います。このオブジェクトのモックを達成する方法はありますか?シングルトン付きのサイコモック
また、コンストラクタはprivateと宣言されています。
を皮肉っ。あなたが本当にこれをモックする必要があるならば、インタフェースをインスタンス化する別のクラスにシングルトンをラップすることでちょっと騙さなければなりません。このインタフェースは、基本的にサードパーティシングルトンタイプのすべてのパブリックメンバーのカーボンコピーである必要があります。
概念はDuck Typingに似ていますが、CLRはDuck Typingをサポートしていないため、プロキシクラスを使用する必要があります。ここで
は一例です:
public interface ISingleton
{
void SomePublicMethod();
Int32 SomePublicProperty{ get; set; }
}
public class SingletonProxy: ISingleton
{
private ThirdPartySingleton _singleton = StaticType.GetSingleton(); // ???
public void SomePublicMethod()
{
_singleton.SomePublicMethod();
}
public Int32 SomePublicProperty
{
get{ return _singleton.SomePublicProperty; }
set{ _singleton.SomePublicProperty = value; }
}
}
あなたはこれをで使用しているどんなタイプだから今では、あなたがそのようなサービスの依存関係として、これを渡すことができます。
あなたがする必要があります今public class TypeThatUsesSingleton
{
private ISingleton _singleton;
public TypeThatUsesSingleton([HopefullySomeDependencyInjectionAttributeHere] ISingleton singleton)
{
_singleton = singleton;
}
public void DoStuff()
{
_singleton.SomePublicMethod();
}
}
あなたのテストで授業を喜んで模擬して、それを依存関係として渡すことができます:
[Test]
public void ShouldAssertSomeBehavior()
{
var repo = new MockRepository();
var singleton = repo.DynamicMock<ISingleton>();
var sut = new TypeThatUsesSingleton(singleton);
using(repo.Record())
{
singleton.SomePublicMethod();
}
using(repo.Playback())
{
sut.DoStuff();
}
}
Voila!幸いなことに、頭痛のないシングルトンを嘲笑しました。あなたはおそらく、プロキシクラス全体が尻の痛みになると思っていますが、幸運にもいくつかの良い人がこれを少し楽にしました。先ほどお話したDuck Typingの全部...実行時にプロキシクラスを生成するオープンソースライブラリがあります。
サードパーティのシングルトンが具体的なクラスではなくインターフェイスを返す場合、Rhinoのモックはそれをモックすることができます。
あなたはそれをスタブにしたい場合は、チェックアウトRhinoはあなたがインターフェイスを持っている必要がRhinoMocksでMockRepository.Stub<IMyInterface>()