汎用リポジトリと作業単位パターンを 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);
}
}