Rhino Mocksは依存性注入とコンストラクタインジェクションを使用するデザインパターンと密接に結びついていますが、私は通常、依存性注入のパラダイムに従わず、テストツール用にソリューションを再構築したくありません。仮想保護されたファクトリメソッドを使用して、クラス内で作成されたオブジェクトをモックしますか?
このシナリオを取る:これは私は、一般的に、依存関係を注入したくなりそうではありませんので、
class MyClass{
public void MyMethod(...){
var x = new Something(...);
x.A();
x.B();
x.C();
}
}
代わりに次の手順を実行するのは非常に典型的なと受け入れられるだろう - それはの一部とみなすことができますMyClass
'の動作/ロジック。
class MyClass{
public void MyMethod(...){
var x = NewSomething(...);
x.A();
x.B();
x.C();
}
virtual protected Something NewSomething(...){
return new Something(...);
}
}
は今、私は右...私のテストプロジェクトにおける具体的なクラスとして、またはRhinoのいずれかを使用してMyClass
を拡張する(と思う)ことができますか?これは正しいですか?)b)合理的に賢明で一般的なやり方ですか?
私がDI以外で見ることのできるもう1つのアプローチは、実際には私のプロジェクトにClassFactory
クラスがあり、必要に応じてすべてのインスタンスを作成するということです。私は私のテストでそれを模倣する方法を見つける/スタブ。しかし、これは私には「臭い」と思われますが、それは一部の人々が使用するパターンであると認識しています。
ここに「何か」とは何ですか?コンストラクタで何らかのSomethingFactory(例えば 'Func')を受け入れると、確かに柔軟性が増します。基本的には、あなたのプロードコードはまだSomethingと密接に結合しています...これを依存関係として考えることを試みてください。 –
@JonSkeetええ、これは問題を取り除きますが、私は卸売DIで販売されていません。ここでその議論はしませんが(!)、代わりのアプローチを指摘してくれてありがとう、それは確かに有効です。 –
これはちょっと奇妙な質問です。あなたのアプローチの「合理性」は、他の合理的なアプローチがどれほど妥当であるかとはまったく関係がありますが、あなたはそれらを議論するつもりはありません。もしあなたが「このコードは動作するでしょうか」と尋ねるのであれば、答えは「はい」ですが、自分で試してみることができます。 –