2011-07-18 6 views
0

ドメインモデルを構築するとき、私は実際に行動を起こすために必要なものだけを公開することを実用的にしようとしていますが、私の単体テストでは、クラス。誰もこれをどのように扱っていますか?私のドメイン層は私のアプリケーションサービス層を通してしかアクセスされていませんので、それは本当にです。私はそれらを内部にしてテストプロジェクトにアクセスする必要がありますか?ドメインモデル(公有地を公開する)

どのような助けが素晴らしいでしょう!

答えて

0

ことができます。

あなたに状況は、あなたのデザインが気にならないかもしれないように聞こえるそれは正しい。プライベート変数をチェックする必要がある単体テストについて話していますが、単体テストはパブリックAPIを使用して完全に定義する必要があります。

プライベートフィールドが一部のレイヤーで公開されるようにオブジェクトを分割する(オブジェクトをより細かくする)か、それらのプライベートフィールドにアクセスしなくてもよいようにテストを変更する(単位テストをより粗くする)。

有用なツールの1つCode Contracts.コードコントラクトを使用して非常に細かいテスト(事後条件とオブジェクト不変条件を定義し、プライベートフィールドの観点から定義)を定義し、単体テストを少し粗くすることができます。私の単体テストの中には、メソッドを呼び出してコード契約が発動しないことを保証するだけのものもあります。

+0

私は、メソッド呼び出しでストーリークラスを持っています。そのメソッドの中で、私はdateプロパティにsubmitを設定します。今、そのプロパティ値は私のドメイン層のどこにも使われていません。しかし、読取り層はそれを表示目的で使用する。それは役に立ちますか? UIの唯一の理由のために公開する。私のテストは、それが正しく設定されていることを確認するためにそれに対して主張します。 – Marco

+0

@Marco SubmittedOnDateプロパティがストーリーのプロパティである場合、それを公開するのは何が問題なのですか? – scottm

+0

私はそれがにおいをするとは思わない。私は独自のパブリックAPI(絶対に必要な場合を除き、内部構造はありません)を使用して、各レイヤーが独立していることを支持しています。したがって、 'Story'クラスは' SubmittedDate'プロパティを持っているか、そうではありません。そうでなければ、UIレイヤーはそれを使用できません。もしそうなら、単体テストもそれを使うことができます。私にとって、UIレイヤーによってのみ読み込まれる内部の 'SubmittedDate'を持つことは、コードの臭いです。それはあなたの特定のUIレイヤーのために存在する' Story'クラスにハッキングされた隠されたAPIです。デザインの依存関係が間違った方向に向いています。 –

1

あなたのコードを見ることなく、あなたのデザインを変更する必要があるかもしれません。インターフェースを抽出し、dependancy injectionをクラスに組み込むことを考えて、必要に応じて内部状態を設定することができます。このメソッドを使用すると、構築中にプライベートメンバーを設定できます。また、模擬ライブラリを使用してみてください。 Moqは私のお気に入りです。

2

単体テストに対応するために、クラスのパブリックインターフェイスを変更することは常に悪い考えです。それが「犬を揺らす尻尾」です。

あなたはそれをテストするために、オブジェクトの内部状態にアクセスする必要がある場合、私は、オブジェクトのプライベートプロパティ(例えば、T GetPropertyValueByName(この文字列propertyNameの)への容易なアクセスを許可する私のテストの名前空間のいくつかの拡張メソッドを作成しますが。

+0

Visual Studioは内部の詳細へのアクセスを許可するラッパーを生成することができます。http://msdn.microsoft.com/en-us/library/bb385974.aspx –

0

私はユニットテストは、クラスのAPIに影響を与えるべきではないというエリックの声明に同意ユニット・テスト・ライブラリードメインライブラリーのfriendを作り、内部に、あなたのドメインクラスのプライベートメンバーを変更します。

関連する問題