1

アプリケーションを単体テストする方法を理解しようとしていますが、すべてがどのように組み合わされるのかよくわかりません。

PluralSight (SPA) に関する John Papa のチュートリアルに従い、まったく同じ方法でモデル、リポジトリ、および作業単位を構築しました。残念ながら、彼はこれを単体テストする方法の例を提供していません。

私はMoqをいじってみましたが、その方法を説明するオンラインのリンクはほとんど見つかりませんでしたが、残念ながらどこにも行きませんでした.

コンテキストを提供するコード:

public interface IRepository<T> where T : class
{
    IQueryable<T> GetAll();
    T GetById(int id);
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    void Delete(int id);
}

public interface IFeedbackRepository : IRepository<Feedback>
{
    IQueryable<Feedback> GetByFeedbackFor(int id);
}

public class FeedbackRepository : EFRepository<Feedback>, IFeedbackRepository
{
    public FeedbackRepository(WebAppDbContext context) : base(context) { }
    public IQueryable<Feedback> GetByFeedbackFor(int id) 
    {
        return DbSet.Where(f => f.FeedbackForId == id);
    }
}

public interface IWebAppUow
{
    void Commit();

    IFeedbackRepository Feedbacks { get; }
}

   public void TestMethod1()
    {
     Mock<IWebAppUow> mockUnitOfWork = new Mock<IWebAppUow>();

    // THEN ??
    }

編集: このリンク ( http://msdn.microsoft.com/en-us/data/dn314429.aspx ) を見つけました。これは、その方法を説明していますが、DbSet で直接動作します。この例を UoW とリポジトリ パターンを使用するように変更する方法を誰かが説明できれば、それはすばらしいことです。

4

3 に答える 3

1

私はあなたのリポジトリを単体テストしません.DbContextは実際のデータベースに依存する具象クラスです.私が知る限り、Moqでモックすることはできません. そのため、私が行っているのは、リポジトリを使用するコードの単体テストに焦点を当て、代わりにリポジトリをモックすることです。

リポジトリを実際にテストするには、統合テストを使用します。

于 2013-11-10T14:27:27.997 に答える
1

単体テストを初めて使用する場合、EF のテストは開始するのに最適な方法ではありません。そのコンテキストとすべての API をモックするのは非常に難しいためです。いくつかの簡単な例に従うことをお勧めします。

EF単体テストについては、Effort frame workにチェックインすることをお勧めします。これがそのウェブサイトで説明されていることです

Effort は、Entity Framework ベースのアプリケーションの自動テストを簡単に作成できる強力なツールです。これは基本的に、従来の外部データベースではなく、軽量のインプロセス メイン メモリ データベースですべてのデータ操作を実行する ADO.NET プロバイダーです。このプロバイダーを既存の ObjectContext または DbContext クラスで非常に簡単に使用できるようにするいくつかの直感的なヘルパー メソッドも提供します。既存のコードに簡単に追加するだけで、外部データベースがなくても実行できるデータ ドリブン テストを作成できます。

于 2013-11-09T19:04:36.713 に答える
1

したがって、私があなたのコメントを正しく理解していれば、FeedbackRepositoryクラスのメソッドをテストしたいと思うでしょう。メソッドでそれを行う方法を見てみましょうGetByFeedbackFor

あなたはWebAppDbContext contextあなたのFeedbackRepository. あまり良くありません。おそらく、このコードをテストすることはできません。インターフェイスを抽出してctorIWebAppDbContextに渡す必要があります。FeedbackRepository

このコードの背後にあるものがわからない return DbSet.Where(f => f.FeedbackForId == id); ので、これは基本クラスのプロパティであるとしか推測できません...しかし、ここでDbSetプロパティではなくコンテキストを使用していると仮定すると、テストメソッドは次のようになります(次のようになると思いますベースプロパティの場合、書き直すのはそれほど難しくありません(または、そのままで機能する場合もあります):

public void ShouldReturnFeedbacksForCorrectId()
{
  var contextMock = new Mock<IWebAppDbContext>();

  // fill expected for example with 2 entities with FeedbackForId == 1
  IQueryable<Feedback> expected = InitWithDataSomehow();
  contextMock.Setup(i => i.Feedbacks).Returns(expected);
  var repositoryUnderTest = new FeedbackRepository(contextMock);

  IQueryable<Feedback> actualResult = repositoryUnderTest.GetByFeedbackFor(1);

  Assert.AreEqual(expected, actualResult);
}
于 2013-11-10T14:17:03.333 に答える