1

汎用リポジトリと作業単位パターンを Entity Framwork Code First と共に使用して、データ アクセス レイヤーを構築しました。リポジトリの単体テストは無意味に思えるので、代わりにいくつかの統合テストを作成することにしました。そのために、統合テスト専用のプロジェクトを作成し、カスタム データベース初期化子を追加しました。これは、もちろん別の接続文字列を使用して、データベースにいくつかのテスト データをシードします。

私の質問は次のとおりです。テスト コードでデータベースを初期化する方法と時期を教えてください。ヌニットを使用しています。また、私は知りたいです-私のリポジトリは汎用実装を使用しているため、作業単位内のすべてのリポジトリをテストする必要がありますか、それともランダムなものを選択する必要がありますか?

私のコードは次のようになります。

public interface IRepository<T> where T:class, IEntity
{
    void Add(T entity);
    T GetById(int id);
    IQueryable<T> All();
    IQueryable<T> Where(Expression<Func<T, bool>> filter);
    void Update(T entity);
    void Delete(T entity);
}

 public interface IUnitOfWork : IDisposable
 {
        IRepository<Album> Albums { get; }
        IRepository<Genre> Genres { get; }
        IRepository<Artist> Artists { get; }
        void Commit();
  }  

public class EFRepository<T> : IRepository<T> where T : class,IEntity
{
    private DbContext _context;
    private DbSet<T> _set;

    public EFRepository(IMvcStoreContext context)
    {
        if (context == null)
            throw new NullReferenceException("context is null");

        _context = context as DbContext;

        _set = _context.Set<T>();

    }

    public void Add(T newEntity)
    {
        _set.Add(newEntity);
    }

    public T GetById(int id)
    {
        return _set.Find(id);
    }

    public IQueryable<T> All()
    {
        return _set;
    }

    public IQueryable<T> Where(Expression<Func<T, bool>> filter)
    {
        return _set.Where(filter);
    }

    public void Update(T entity)
    {
        throw new NotImplementedException("method not implemented");
    }

    public void Delete(T entity)
    {
        _set.Remove(entity);
    }
}
4

1 に答える 1

0

2 番目の質問への回答を探してここに来たので、その質問への回答はありません。データベースのテストには、NDBUnitを使用します。セットアップとティアダウンを TestFixureXXX メソッドに入れているので、テストごとに 1 回だけデータベースをシードする必要があります。これにより、遅いテストが少し速く実行されます。NDBUnit のヘルプが必要な場合はお知らせください。

エリック

于 2013-01-16T17:28:58.693 に答える