【问题标题】:integration testing for entity framework to ensure associations are correct实体框架的集成测试以确保关联正确
【发布时间】:2023-04-03 09:45:01
【问题描述】:

我想这更像是一个集成测试,但有没有人有一个关于如何测试以确保实体框架 (4) 模型中的关联按预期工作的好教程的链接?

我的想法是为此使用 sqllite 之类的东西,因为我想确保我可以保存一个实体,并添加一个子实体并保持它等等。

【问题讨论】:

    标签: c# .net entity-framework unit-testing integration-testing


    【解决方案1】:

    如果您首先使用代码,则可以使用模拟框架来测试您的实现。

    至于您可以在那里使用的 IDbSet 实例,以下内容很有用:

    public class InMemoryDbSet<T> : IDbSet<T> where T : class
    {      
        private readonly HashSet<T> _data;
        private readonly IQueryable _query;
    
        public Type ElementType
        {
            get
            {
                return this._query.ElementType;
            }
        }
    
        public Expression Expression
        {
            get
            {
                return this._query.Expression;
            }
        }
    
        public IQueryProvider Provider
        {
            get
            {
                return this._query.Provider;
            }
        }
    
        public InMemoryDbSet()
        {
            this._data = new HashSet<T>();
            this._query = _data.AsQueryable();
        }
    
    
        public T Add(T entity)
        {
            this._data.Add(entity);
            return entity;
        }
    
    
        public T Attach(T entity)
        {
            this._data.Add(entity);
            return entity;
        }
    
    
        public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : class, T
        {
            throw new NotImplementedException();
        }
    
        public T Create()
        {
            return Activator.CreateInstance<T>();
        }
    
        public virtual T Find(params Object[] keyValues)
        {
            throw new NotImplementedException("Derive from FakeDbSet and override Find");
        }
    
    
        public System.Collections.ObjectModel.ObservableCollection<T> Local
        {
            get
            {
                return new System.Collections.ObjectModel.ObservableCollection<T>(_data);
            }
        }
    
    
        public T Remove(T entity)
        {
            this._data.Remove(entity);
            return entity;
        }
    
    
        public IEnumerator<T> GetEnumerator()
        {
            return this._data.GetEnumerator();
        }
    
        IEnumerator IEnumerable.GetEnumerator()
        {
            return this._data.GetEnumerator();
        }
    
    }
    

    使用这种方法应该使您能够完全在内存中运行测试,而无需访问数据库,但是,正如我所说,仅在代码中优先,因为据我所知,IDbContext 仅用于那里。

    【讨论】:

    • 您可以模拟 DbSet,但您只是在测试 Linq2Objects 而不是 Linq2Sql。它永远不会执行 SQL,从而使数据库访问未经测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多