首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Entity Framework创建的数据库进行单元测试,使用Effort和dbContext

使用Entity Framework创建的数据库进行单元测试,使用Effort和dbContext
EN

Stack Overflow用户
提问于 2017-03-16 18:55:59
回答 2查看 1K关注 0票数 1

我正在努力创建假的数据库实例,但我遇到了一个问题。ObjectContextFactory有一个CreateTransistent泛型方法,它需要定义一个ObjectContext类型:

代码语言:javascript
复制
public static T CreateTransient<T>( ) where T : ObjectContext;

因此,据我所知,我可以定义泛型类型:

代码语言:javascript
复制
class MyObjectContextClass : ObjectContext
{
   //Entity definition here
}

因此,我可以在单元测试类中执行以下操作:

代码语言:javascript
复制
var effortContext = ObjectContextFactory.CreateTransient<MyObjectContextClass>()

到目前为止一切都很好,对吧?但我的context类继承自dbContext类:

代码语言:javascript
复制
class MyRealDbContextClass : DbContext
{
    // Entity definition here
}

我发现DbContext是一个包装类,它由ObjectContext组成

所以我的问题是:如何检索自定义ObjectContext的类型,以便在effort静态方法中使用它?我需要像这样的东西:

代码语言:javascript
复制
var type = MyRealDbContextClass.GetObjectContextType();

所以我可以:

代码语言:javascript
复制
var effortContext = ObjectContextFactory.CreateTransient<type>()
EN

回答 2

Stack Overflow用户

发布于 2017-03-16 20:12:33

我在过去所做的是在我的Base测试类中定义了一个方法(因为所有测试都需要这个方法)来生成我的dbset,如下所示:

代码语言:javascript
复制
public static IDbSet<T> GenerateSet<T>(IList<T> data) where T : class
    {
        IQueryable<T> queryable = data.AsQueryable();
        IDbSet<T> dbSet = MockRepository.GenerateMock<IDbSet<T>, IQueryable>();
        dbSet.Stub(x => x.Provider).Return(queryable.Provider);
        dbSet.Stub(x => x.Expression).Return(queryable.Expression);
        dbSet.Stub(x => x.ElementType).Return(queryable.ElementType);
        dbSet.Stub(x => x.GetEnumerator()).Return(null).WhenCalled(x => queryable.GetEnumerator());

        return dbSet;
    }

然后在我的测试类中,我可以这样做:

代码语言:javascript
复制
[TestClass()]
public class ConcreteText: TestBase
{    
    private IMyDbContext _context;

    [TestInitialize]
    public new void Initialize()
    {
        base.Initialize();
        _context = MockRepository.GenerateMock<IMyDbContext>();
        _context.Stub(x => x.DbSetName).PropertyBehavior(); // Name of your dbset
        _context.DbSetName = GenerateSet(DbSetCollection); // Define a mock dbset collection
    }
 }
票数 0
EN

Stack Overflow用户

发布于 2018-11-15 05:43:25

而不是使用:

代码语言:javascript
复制
var effortContext = ObjectContextFactory.CreateTransient<MyObjectContextClass>()

我使用:

代码语言:javascript
复制
var con = Effort.EntityConnectionFactory.CreatePersistent(connectionString);

然后,我可以在我的DbContext类中使用effort DB连接

代码语言:javascript
复制
using System.Data.Common;
using System.Data.Entity;

namespace MC.ClientApi.CompanyProfile.Repository
{
    public partial class MyDBCoreDBEntities : DbContext
    {
        public MyDBCoreDBEntities(string connectionString)
            : base(connectionString)
        {
        }
        public MyDBCoreDBEntities(DbConnection connection) : base(connection, true) { }
    }
}

我如何进行单元测试的完整示例:

我的存储库方法使用工厂来创建上下文

存储库:

代码语言:javascript
复制
public class OrganizationOptionsRepository : BaseEFRepository, IOrganizationOptionsRepository
    {
        private readonly IContextFactory ContextFactory;

        public OrganizationOptionsRepository(IContextFactory contextFactory)
        {
            ContextFactory = contextFactory;
        }

        public Result<IList<Country>> GetAllCountries()
        {
            using (var context = ContextFactory.CreateNew())
            {
                IQueryable<Country> query = context.Countries.OrderBy(x => x.NiceName);
                IList<Country> resultList = query.FromCache().ToList();
                return Result.Ok(resultList);
            }
        }
    }

工厂:

代码语言:javascript
复制
public class ContextFactory : IContextFactory
    {
        public string ConnectionString { get; set; }
        public ContextFactory(string connectionString)
        {
            ConnectionString = CreateEFConnectionString(connectionString, RepositoryConst.EdmxName);
        }

        public MyDBCoreDBEntities CreateNew()
        {
            return new MyDBCoreDBEntities(ConnectionString);
        }
    }

我的单元测试继承自我的工厂,并返回工作上下文而不是实际上下文

代码语言:javascript
复制
public class TestContextFactory : IContextFactory
    {
        public MyDBCoreDBEntities CreateNew()
        {
            var connectionString = "sampleConnString";
            var con = Effort.EntityConnectionFactory.CreatePersistent(connectionString);
            return new MyDBCoreDBEntities(con);
        }


    }

我的测试初始化方法:

代码语言:javascript
复制
   [TestInitialize]
        public void Initialize()
        {
            ContextFactory = new TestContextFactory();
            _Context = ContextFactory.CreateNew();
            Repository = new NyDBRepository(ContextFactory);
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42832065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档