このファクトリ クラスがあり、正しくテストしたいと考えています。多くの子(継承)を持つ抽象クラスがあるとしましょう。
Factory クラスのメソッド BuildChild でわかるように、実行時に子クラスのインスタンスを作成できるようにしたいと考えています。実行前に型がわからないため、実行時にこのインスタンスを作成できる必要があります。そして、このプロジェクトに Unity を使用することはできません (もしそうなら、これを達成する方法を尋ねません)。
テストしたい Factory クラスは次のとおりです。
public class Factory
{
public AnAbstractClass BuildChild(Type childType, object parameter)
{
AnAbstractClass child = (AnAbstractClass) Activator.CreateInstance(childType);
child.Initialize(parameter);
return child;
}
}
これをテストするには、Mock Activator.CreateInstance を使用して、子クラスの自分自身のモック オブジェクトを返す方法を見つけたいと考えています。どうすればこれを達成できますか?または、Activator.CreateInstance (および Unity) を使用せずにこれを行うためのより良い方法があれば、テストとモックが簡単であれば、私はそれを受け入れます!
現在 Moq を使用してモックを作成していますが、Activator.CreateInstance は静的クラスの静的メソッドであるため、これを行う方法がわかりません (Moq はオブジェクトのモック インスタンスしか作成できないことは既にわかっています)。
私は Microsoft の Fakes を調べましたが、成功しませんでした (どのように機能するかを理解し、よく説明された例を見つけるのに苦労しました)。
私を助けてください!
編集:
Activator.CreateInstance をモックする必要があるのは、このメソッドが別のモック オブジェクトを返すようにするためです。私が望む正しいことは、このメソッドをスタブ化することだけです(モックするのではありません)。
したがって、BuildChild を次のようにテストすると、次のようになります。
[TestMethod]
public void TestBuildChild()
{
var mockChildClass = new Mock(AChildClass);
// TODO: Stub/Mock Activator.CreateInstance to return mockChildClass when called with "type" and "parameter" as follow.
var type = typeof(AChildClass);
var parameter = "A parameter";
var child = this._factory.BuildChild(type, parameters);
}
タイプとパラメーターを指定して呼び出された Activator.CreateInstance は、実際の子クラス (まだ実装されていない) の新しいインスタンスを作成する代わりに、モック オブジェクトを返します。