2011-09-19 12 views
3

のためのハウツーユニット・テストモデル生成されたターゲットオブジェクトを見ると、ID = 0で作成されます。Nameが必要であることをどのようにテストできますか?Entity FrameworkのTDD、必要なフィールド

Nameフィールドが必要な場合は、Agentオブジェクトを作成するにはどうすればよいですか?本当のIDはいつ割り当てられますか?モデル自体をテストするには、IDを割り当てるにはDbContextを作成/モックアップする必要がありますか?

答えて

5

ここでPOCOクラスを扱っていることに注意してください。Agentクラスの構築が失敗するという魔法はありません。カスタム属性をそのプロパティの1つに置いたからです。

エンティティフレームワークは、検証中およびデータマッピング中にカスタム属性をチェックしています。この場合、Required属性をチェックし、対応する文字列プロパティがnullでなく、有効である場合にのみエンティティを宣言します。名前をデータベースのnull不可能な列にマップします。

:あなた つまり、つまりは確か Required属性が飾られているすべてのプロパティが値を持っていることを確認し、このような何かを同じチェックを実行し、あなたのユニットテストのカスタム検証ルーチンを記述することができることをミラーに

[TestMethod()] 
public void AgentWithNoNameIsInvalid() 
{ 
    Agent target = new Agent(); 

    Assert.IsFalse(IsValid(target)); 
} 

これはあなたのコードではなくEFをテストしているように感じます。

IDはプライマリキーなので、エンティティがデータベースにコミットされたときにのみ割り当てられます。だから完全なテストのためには、仕事の単位とあなたのためにこれを行う文脈を模擬しなければならないでしょう。多くの落とし穴があり、このアプローチを非常に脆弱にするIQueryable<T>IEnumerable<T>の微妙な(そしてそれほど微妙ではない)違いがあります。

個人的には、既知のコンテンツを持つ別のテストデータベースに基づいてEFとの統合テストを行い、このテストデータベースに基づいて単体テストと期待される結果を書くことをお勧めします - これはTDDではないかもしれませんが、私が正しいことをテストしていることを確認する方法。

+0

私は「一般的にPOCOクラスは単体テストではないのでしょうか?Intead、クラス自体ではなくデータ/エンティティをテストできますか? –

+0

また、検証ルーチンのために、どのプロパティを '必須'思考コードとするか、 'IsRequired(Agent.Name)'のようなものをチェックする方法はありますか? –

+0

@pstarリフレクションを使用することができます。後で時間がある場合は例を追加します。最初のコメントに同意します。クラス自体ではなくビジネスロジックを実行した後、POCOクラスの期待値をテストする必要があります。 – BrokenGlass

関連する問題