2016-05-12 13 views
1

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クラスがあり、必要に応じてすべてのインスタンスを作成するということです。私は私のテストでそれを模倣する方法を見つける/スタブ。しかし、これは私には「臭い」と思われますが、それは一部の人々が使用するパターンであると認識しています。

+2

ここに「何か」とは何ですか?コンストラクタで何らかのSomethingFactory(例えば 'Func ')を受け入れると、確かに柔軟性が増します。基本的には、あなたのプロードコードはまだSomethingと密接に結合しています...これを依存関係として考えることを試みてください。 –

+0

@JonSkeetええ、これは問題を取り除きますが、私は卸売DIで販売されていません。ここでその議論はしませんが(!)、代わりのアプローチを指摘してくれてありがとう、それは確かに有効です。 –

+0

これはちょっと奇妙な質問です。あなたのアプローチの「合理性」は、他の合理的なアプローチがどれほど妥当であるかとはまったく関係がありますが、あなたはそれらを議論するつもりはありません。もしあなたが「このコードは動作するでしょうか」と尋ねるのであれば、答えは「はい」ですが、自分で試してみることができます。 –

答えて

1

レガシーコードをもっとテストできるようにしようとしているときにこれを数回使っていますが、実際には戻ってきて後で噛むのが大好きです。

基本的に、モック/偽物/テストダブルがあなたの敵です。あなたはそれらを憎むべきであり、それらを避けるべきです(編集注記:私はそれらを使用しないと言っているわけではありません。それはすべてのコードが悪いコードであるというパラダイムから始まり、タスクを完了するために必要なだけのコードを書く必要があります。バーチャルメソッドをオーバーライドするテストダブルの束を持つことは、コードを非常に堅固にします。プロダクションコードがメソッドを1つの場所で呼び出す場合でも、メソッドのシグネチャを変更するのは本当に面倒です。テストダブルも破損するためです。それはまた後で混乱をきれいにし、実際に依存を注入することに苦痛を与えます(そして、私は物事を注入することは客観的により良い(tm)と主張します)。

基本的には次のようになります:はい、これを行うと、コードをテストしやすくなりますが、テストによって得られるメリットはありません。あなたはより良いデザインを得ることができません。硬いコードなどを持っています。

私は実際に何かを見るためにテストを得るためにこれを使ったと言いたいので、私は指を指さないでしょう。働くそれは "十分に良い"一時的な解決策かもしれませんが、私の最終的な答えは "おそらくそれを避けることができれば(おそらくテストされたコードを持っていれば)"ということでしょう。

0

あなたが提案している方法で単一責任パターン(SRP)を犠牲にして、読んで理解し維持することが難しいコードを作成することは間違いなく、そこに匂いがあります。テスト。

テストを実行すると同時に、SOLID principlesに従わない場合、時間、可読性、または敏捷性はどこで保存されますか? (私は正直に知りたいです)。

DI原理では、テストを依存関係から完全に分離して実行することができます。これはまさにあなたがしたいことです。

OOPのソリッドの原則には多くの良い議論がありますが、私はいつも学んで間違っていますが、私は数年間のソリッドコードで盲目にされているかもしれません。私のプロジェクトを確実にするグリーンユニットテストの

+0

それは臭いですが、私はテストツールに合うように私のコードベース全体を再構築することはずっと匂いが増していると言います。私はまた、私のクラスを_use_にするのが難しくなるのを待っています。 –

+0

お聞きします。モノリスの再設計は、1回のシングルパス操作では決して行われません。しかし、パイプでパイプを縦にするのを妨げるものは何もありません。ソリッドの原則は、コードを読みやすく理解しやすくすることを忘れないでください。クラスに他のクラスとの依存関係を持たせる方が便利だと思うかもしれませんが、長期的には、あなたの背中に噛まれてしまいます。クラスNewSomethingを変更する必要がある場合は、その変更をどこでも使用するように強制されます。あなたはもはや匂いはしませんが、悪い悪臭はあります:) –

関連する問題