使用实体框架代码First和Nunit的通用存储库的集成测试

时间:2012-11-14 17:44:42

标签: c# entity-framework ef-code-first nunit integration-testing

我使用通用存储库和工作单元模块以及Entity Framwork Code First构建了数据访问层。单元测试存储库对我来说似乎毫无价值,所以我决定创建一些集成测试。为此,我创建了一个专门用于intregrations测试的项目,并添加了一个自定义数据库初始化程序,它将使用一些测试数据为数据库播种,当然使用不同的连接字符串。

我的问题是:如何以及何时在我的测试代码中初始化数据库?我正在使用Nunit。我也想知道 - 因为我的存储库使用了通用实现 - 我应该在我的工作单元中测试每个存储库还是只选择一个随机存储库?

我的代码如下:

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);
    }
}

1 个答案:

答案 0 :(得分:0)

我来到这里寻找你的第二个问题的答案,所以我没有答案。 对于数据库测试,我使用NDBUnit。 我把设置和拆解放在TestFixureXXX方法中,所以每次测试我只需要为数据库播种一次;这使得慢速测试运行得更快一些。如果您需要NDBUnit的帮助,请告诉我。

埃里克