C# 模拟DbContext更新方法错误-在建立与SQL Server的连接时发生网络相关或实例特定的错误

C# 模拟DbContext更新方法错误-在建立与SQL Server的连接时发生网络相关或实例特定的错误,c#,entity-framework,unit-testing,moq,C#,Entity Framework,Unit Testing,Moq,我对单元测试方法有问题。我正在测试一个控制器操作,它使用一个提供了模拟DbContext对象的存储库 我得到了标题中指定的错误,但是由于DbContext是一个mock(moq)对象,我不明白为什么它不工作 我正在测试的方法是 public virtual void Update(TEntity entityToUpdate) { this.DbSet.Attach(entityToUpdate); this.Context.E

我对单元测试方法有问题。我正在测试一个控制器操作,它使用一个提供了模拟DbContext对象的存储库

我得到了标题中指定的错误,但是由于DbContext是一个mock(moq)对象,我不明白为什么它不工作

我正在测试的方法是

  public virtual void Update(TEntity entityToUpdate)
        {
            this.DbSet.Attach(entityToUpdate);
            this.Context.Entry(entityToUpdate).State = EntityState.Modified; //here the error is thrown
        }
存储库的创建如下所示(.ReturnsDbSet()来自)

var enumerable=newlist();
// ... 填充模拟列表
var mockedContext=new Mock();
Setup(c=>c.Users).ReturnsDbSet(可枚举);
mockedContext.Setup(c=>c.Set()).ReturnsDbSet(可枚举);
var repo=new Mock();
返回新存储库(mockedContext.Object,this.logger);
存储库片段:

public class Repository<TEntity> :  IRepository<TEntity> where TEntity : class
{
        protected internal MyDbContext Context;
        protected internal DbSet<TEntity> DbSet;
        public Repository(MyDbContext context)
        {
            this.Context = context;
            this.DbSet = context.Set<TEntity>();
        }

        public virtual IQueryable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null)
        {
            IQueryable<TEntity> query = this.DbSet;

            if (filter != null)
            {
                query = query.Where(filter);
            }

            return query;
        }
公共类存储库:i存储,其中tenty:class
{
受保护的内部MyDbContext上下文;
受保护的内部数据库集;
公共存储库(MyDbContext上下文)
{
this.Context=Context;
this.DbSet=context.Set();
}
公共虚拟IQueryable Get(表达式筛选器=null)
{
IQueryable query=this.DbSet;
if(过滤器!=null)
{
query=query.Where(过滤器);
}
返回查询;
}
初始化器只调用Seed方法,并添加一些样板实体进行开发。(DropCreateIfModelChanges)

公共类MyDbContext:DbContext
{
public MyDbContext():base(“name=MyDatabaseConnection”)
{
SetInitializer(新的MyBinInitializer());
}
公共虚拟数据库集项目{get;set;}
公共虚拟数据库集用户{get;set;}
}

为什么会出现此错误?

显示DbContext的定义。很可能在初始化时,它试图连接到实际数据库,但由于可能不存在连接字符串(“name=MyDatabaseConnection”),因此将失败它正试图连接到数据库。这就是原因。对数据库访问进行抽象,以便在没有紧密耦合实现的情况下对其进行模拟concerns@Nkosi-好的,但我有几十个测试使用同一个存储库对象,工作正常-例如,我也在测试“Insert”方法,我没有要解决的错误这需要创建一个接口
IDbContext
,并让MyDbContext实现它,您的存储库应该依赖于该接口。在测试中,您需要创建接口的模拟。今天我遇到了这个错误,所以我删除了定义状态的行,它开始为我工作(
Db.Entry(obj).State=EntityState.Added
public class Repository<TEntity> :  IRepository<TEntity> where TEntity : class
{
        protected internal MyDbContext Context;
        protected internal DbSet<TEntity> DbSet;
        public Repository(MyDbContext context)
        {
            this.Context = context;
            this.DbSet = context.Set<TEntity>();
        }

        public virtual IQueryable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null)
        {
            IQueryable<TEntity> query = this.DbSet;

            if (filter != null)
            {
                query = query.Where(filter);
            }

            return query;
        }
public class MyDbContext : DbContext
    {
        public MyDbContext() : base("name=MyDatabaseConnection")
        {

            Database.SetInitializer<MyDbContext>(new MybInitializer());

        }

        public virtual DbSet<Project> Projects { get; set; }
        public virtual DbSet<User> Users { get; set; }

    }