2010-11-22 9 views
1

私は、TDDと一緒に昨年、MoqとRhino Mockを使っています。私は本当にこのような方法で開発を楽しんだことがありますが、これは私がやるべきことではないかもしれないと私のプロジェクトで指摘しています。私のビジネスレイヤーをテストするには?

私はテストし、私のデザインを運転し、すべて正常に動作します。今私はテストする必要があるオブジェクトの上にレイヤーを持っています。私は多くのオブジェクトを持っているので(インタフェースを介してInversion of Controlを使用している)、これらのサービスをすべてスタブしたり、嘲笑したりするのはとても大変な作業です。 1つのテストでは、コードをテストする前に少なくとも8つのサービスをスタブアウトする必要があります。実際のメリットがなく、面倒なコードをたくさん書いているようです。

私の質問は「これを行う良い方法はありますか」です。私は本当に単体テストをやっていないので、行動主導型の設計や他の方法論が適していますか?

+0

「サービス」とはどういう意味ですか? WCFサービス? – Simone

+0

私は私の質問を修正しました。私はいくつかの仕事をしているオブジェクトにサービスを参照しました。混乱させて申し訳ありません。 –

+0

は同じ '問題'に直面しているので、時には1行をテストするために100行のコードを設定する必要があります。そして、テストコードを再利用するのは難しいと思います。 – Michel

答えて

1

8つのサービスが必要な場合は、8つのスタブ/モックが必要です。私はあなたがこれを避けることはできないと思います。

コードを少なくしたい場合は、単体テストをリファクタリングして、8つのサービス設定コードすべてをグループ化するための階層またはその他の適切なOO商品を作成することもできます。

EDIT

Otherways、あなたは "megaobject" を作成することができます。 8つのサービスがそれぞれ異なるインタフェースを実装しているとしましょう:IService1IService2などです。単体テストでは、各サービスのインターフェイスをグループ化するインターフェイスを作成できます。

interface ISuperInterface: IService1, IService2, ... { } 

次に、1つのオブジェクトをモックするだけです。

+0

シモンに感謝します。私はあなたがそれを言ってくれるのではないかと心配しました。私は助けてくれたセットアップセクションに多くのコードを入れました。私はいくつかの他の形式のテスト(BDDなど)がこの層でよりうまくいくかどうか疑問に思っていました。 –

+0

更新が何かの援助であることを確認してください – Simone

+0

ニース、あなたがそれを言及したとき、それについて考えていました。私はTDDの仕組みが気に入っています。この層でも非常に多くの依存関係が必要だと確信しています.TDDは道のりです。 –

3

ごくまれにしかには、他の8つのクラスに応じたクラスがあります。

私の経験では、MVVMのModelViewだけがこのような大規模な依存関係を持つ可能性があります。 他のサービスに依存するクラスを持っているビジネスロジックであれば、私はリファクタリングあなたのコードが必要と信じています。

アイデアはの責任の一つです、あなたはより多くのクラスがありますが、それらのコードは少なくなります。

+0

私はオブジェクト、datetimeservice、要求されたオブジェクトの様々なリポジトリ、sessionServiceなどをロギングしています。これらのサービス/オブジェクトはすべてSRPと一貫しています。私が持っている以上に私がどのようにリファクタリングできるかわからない。このレイヤーでは、スタブと嘲笑だけがうまくいくようです。 –

+0

それがそうであれば、これはまれな出来事の1つです。 – Aliostad

1

単位レベルのBDDは、何よりもマインドセットとボキャブラリーについてのものです。 「テスト」という言葉を使わずにクラスについて考えると、その責任と行動に集中するだけで、何が間違っているのかを理解するのに役立ちます。私はあなたのクラスが仕事をするために8つのサービスを必要としていると思います。多分責任が多すぎます。それらの責任の一部を別のクラスに委任して、それを嘲笑してもらえますか?

シナリオレベルのBDDは、実際にはシステム全体の動作、範囲、責任について考え、その周囲で会話するのに役立ちます。私はあなたが話しているクラスのデザインを解決するのに役立つとは思わない。しかし、私のBDDの帽子で私はBDDがテストに関するものではないことを伝えることができます。それは、無知を発見し、それに対処し、その知識を伝えてコードを簡単かつ安全に変えることです。

コードを変更しやすく、変更しても安全なものにすることをお勧めします。誰かが何かを変えたときに壊れそうな脆弱なテストを書いているのであれば、代わりに(シナリオとシステムの動作に)レベルアップしてください。そうでなければ、より良いユニットレベルの例を書いて、@Aliostadが示唆するようにコードをリファクタリングしてください。

+0

BDDの説明をありがとう。あなたは「レベルを上げる」と言いましたが、ここで何を意味するのかをもっと説明できますか? –

+0

BDDは多くの細かいレベルで動作し、作成しようとしているソフトウェアについてあなたが知らないものを発見することを主な目的としています。たとえば、プロジェクトビジョンのレベルでは、プロジェクトで達成すべきものを見て、欠落している市場環境について何かがあるかどうかを検討します。その下には、ステークホルダーの目標、機能セット、機能、ストーリー、シナリオ、コードがあります。 「単位行動」からのレベルアップは「シナリオ」なので、この例では意味しています。それに応じて編集! – Lunivore

+0

あなたの助けてくれてありがとう、私はSimoneの答えに行ってきましたが、本当にあなたが提供した助けに感謝します。 –

関連する問題