2012-04-28 9 views
2

我々は典型的なリポジトリにMSTestをを使用して正しい方法

public class Repository:IRepository<Entity> 
    { 
      public Entity GetById(int id) 
      { 
       //blah 
      } 

      public IEnumerable<Entity> All() 
      { 
       //blah 
      } 

      public void Insert(Entity entity) 
      { 

      } 

      public void Update(Entity entity) 
      { 
       //blah 
      } 

      public void Delete(Entity entity) 
      { 
       //blah 
      } 
    } 

があると、私は、エンティティを挿入、更新するリポジトリの能力をテストしたいです。具体的なリポジトリとしてすぐに、私は実際のDBに対してテストしています。だから、

、私は挿入メソッドをテストする - 戦略は

  1. 明らかなのは、
  2. アサートエンティティがリポジトリ
によって返されたidでエンティティを取得
  • それ保存
  • 新しいエンティティを作成します。

    しかし、私がUpdateメソッドのテストを考えているとき、それはやや面倒です。 主な質問は、DBを確保するために、どのように

    • ですが、すでに私が更新する をフェッチして試すことができ、オブジェクトが格納されていますか?
    • 空のデータベースに対して更新をテストするにはどうすればよいですか?

    回避策のように見えるのは、不要なコードとテストが膨らんでしまうためです。 優雅な解決策はありますか?

  • +0

    あなたは分離されたユニットをテストしているのではなく、複数のユニットを統合しているので、 'unittest'は本当に単体テストではありません。あなたがしたいことを考え直す。コードの単体テストを行う場合は、更新メソッドのみをテストします。更新メソッドが目的のパスに従っているかどうかをテストし、そのインスタンスを意図した状態にしておくことで、これを行うことができます。 – Polity

    +0

    そして、RDBMSを扱う私のリポジトリクラスを単体テストする適切な方法は何ですか?どういうわけか私はそれが何をすべきかを確認する必要があります。 –

    +0

    この方法で試してみてください:更新メソッドを単体テストする必要があります。データベースに障害が発生した場合(たとえばdiskspaceがいっぱいの場合)、更新方法が間違っているか、壊れているとは限りません。アイテムがデータベースで更新されたかどうかは、テストする必要はありません。更新方法が期待したとおりに行われたかどうかを確認する必要があります。 (例えば、データベース層に適切な呼び出しを行います) – Polity

    答えて

    3

    ClassInitializeTestInitializeと一緒に、ClassCleanupTestCleanupを使用して、既知のエンティティでデータベースを事前入力します。次に、あなたのUpdate()テストを実行します。

    「不要なコード」の解釈方法がわかりません... Update()メソッドをテストするためにデータベースを作成するために何かを行う必要があるようです。少なくとも上記の属性を使用すると、実際のテスト方法を汚染することなく、データベースの初期化とクリーンアップに必要なロジックを実装できます。

    +0

    異なるTestメソッドに対して異なるTestInitializeメソッドを使用できますか? –

    +0

    いいえ。彼らはクラス特有です。あなたは別のクラスにテストを分けることができます。 –

    関連する問題