3

我是起订量和单元测试的新手。我想用实体框架 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 的功能,而且我确信已经比您更彻底地测试了它。您可以做的一件事是不要将业务逻辑放入直接与 EF 交互的存储库中,而是将其移至利用存储库进行数据访问的另一层。

于 2013-05-12T05:36:24.630 回答
0

简短的回答是你真的不能。至少不完全。其原因是由于固有的 sql 翻译,moq'd EF 上下文的行为方式与真实上下文不同。

有很多代码会传递 Moq'd 上下文,但会在真实上下文中爆炸。因此,您不能在 EF 上下文中依赖 Moqing 的假货,而必须使用集成测试。

于 2013-03-19T17:29:06.047 回答