3

私はMoqとユニットテストの初心者です。エンティティ フレームワーク 5 を使用してリポジトリと作業単位のパターンをテストしたいのですが、どこからどのように開始すればよいかわかりません。

私のリポジトリインターフェース:

public interface ISmRepository<T>
{
    void Add(T entity);
    void Remove(T entity);
    void Update(T entity);
    IQueryable<T> SearchFor(Expression<Func<T, bool>> expression);
    IQueryable<T> GetAll();
    T GetById(Int64 id);
} 

私のリポジトリ:

public class SmReporitory<T> : ISmRepository<T> where T : class, IEntity, new()
{
    private readonly DbSet<T> _dbSet;
    private readonly DbContext _dbContext;

    public SmReporitory(DbContext dbContext)
    {
        _dbSet = dbContext.Set<T>();
        _dbContext = dbContext;
    }

    public void Add(T entity)
    {
        _dbSet.Add(entity);
    }

    public void Remove(T entity)
    {
        _dbSet.Remove(entity);
    }

    public void Update(T entity)
    {
        _dbContext.Entry(entity).State = EntityState.Modified;
    }

    public IQueryable<T> SearchFor(Expression<Func<T, bool>> expression)
    {
        return _dbSet.Where(expression);
    }

    public IQueryable<T> GetAll()
    {
        return _dbSet;
    }

    public T GetById(long id)
    {
        return _dbSet.FirstOrDefault(x => x.Id == id);
    }
}

私の作業単位インターフェース:

public interface ISmUnitOfWork : IDisposable
{
    ISmRepository<BreakdownCause> BreakdownCasus { get; }
    ISmRepository<BreakDownType> BreakDownTypes { get; }
    ISmRepository<CompanyInformation> CompanyInformations { get; }
    void Save();
}

私の作業単位の実装:

public class SmUnitOfWork : ISmUnitOfWork
{
    private readonly DbContext _dbContext;
    private ISmRepository<BreakDownType> _breakDownTypes;
    private ISmRepository<BreakdownCause> _breakdownCasus;
    private ISmRepository<CompanyInformation> _companyInformations;

    public SmUnitOfWork() : this(new SmDbContext())
    {
    }

    public SmUnitOfWork(SmDbContext smDbContext)
    {
        _dbContext = smDbContext;
    }

    public ISmRepository<BreakdownCause> BreakdownCasus
    {
        get { return _breakdownCasus ?? (_breakdownCasus = new SmReporitory<BreakdownCause>(_dbContext)); }
    }

    public ISmRepository<BreakDownType> BreakDownTypes
    {
        get { return _breakDownTypes ?? (_breakDownTypes = new SmReporitory<BreakDownType>(_dbContext)); }
    }

    public ISmRepository<CompanyInformation> CompanyInformations
    {
        get { return _companyInformations ?? (_companyInformations = new SmReporitory<CompanyInformation>(_dbContext)); }
    }
    public void Save()
    {
        try
        {
            _dbContext.SaveChanges();
        }
        catch
        {
            throw;
        }
    }
    public void Dispose()
    {
        if (_dbContext!=null)
        {
            _dbContext.Dispose();
        }
    }

ここで、ISmRepository インターフェイス メソッドをテストしたいと思います。

クラス ライブラリ プロジェクトで既に NUnit と Moq を参照しています。今、私には出発点が必要です。

4

2 に答える 2

4

リポジトリを作成したので、リポジトリをテストする必要はありません。その理由は、Mystere Man がほの​​めかしたように、基本的に Entity Framework API をラップしているだけだからです。EF を使用し、自分のリポジトリまたはいくつかのリポジトリを使用する場合、DbContext既に述べた理由により、統合テストの時間までこれらのデータ アクセス呼び出しのテストについて心配する必要はありません。

ただし、リポジトリと作業単位をモックして、それらに依存する他のすべてのコードをテストすることはできます (そしてそうすべきです)。リポジトリをテストすることで、実際には Entity Framework の機能をテストしていることになります。それは、あなたよりも徹底的にテストされていると確信しています。できることの 1 つは、ビジネス ロジックを EF と直接対話するリポジトリに配置するのではなく、リポジトリをデータ アクセスに利用する別のレイヤーに移動することです。

于 2013-05-12T05:36:24.630 に答える
0

短い答えは、あなたが本当にできないということです。少なくとも完全ではありません。その理由は、固有の sql 変換のために、moq された EF コンテキストが実際のコンテキストと同じように動作しないためです。

Moq されたコンテキストを渡すコードはたくさんありますが、実際のコンテキストでは失敗します。そのため、EF コンテキストを使用した偽物の Moqing に依存することはできず、統合テストを使用する必要があります。

于 2013-03-19T17:29:06.047 に答える