C# &引用;没有名为'的连接字符串;实体';可以在应用程序配置文件中找到;最小起订量误差

C# &引用;没有名为'的连接字符串;实体';可以在应用程序配置文件中找到;最小起订量误差,c#,entity-framework-6,moq,C#,Entity Framework 6,Moq,我正在使用Moq为我的oracledb提供模拟上下文。但是当我用模拟的上下文调用\u context.Entry时,我得到一个invalidoOperationException “在应用程序配置文件中找不到名为“Entities”的连接字符串。” 我已经提供了一个模拟上下文,所以不确定为什么它仍然试图读取连接字符串来创建上下文 // generated code for oracle db public partial class Entities : DbContext { publ

我正在使用Moq为我的oracledb提供模拟上下文。但是当我用模拟的上下文调用
\u context.Entry
时,我得到一个
invalidoOperationException

“在应用程序配置文件中找不到名为“Entities”的连接字符串。”

我已经提供了一个模拟上下文,所以不确定为什么它仍然试图读取连接字符串来创建上下文

// generated code for oracle db
public partial class Entities : DbContext
{
    public Entities()
        : base("name=Entities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<ACTIVITY_CODE> ACTIVITY_CODE { get; set; }
}

// my code
public partial class Entities : System.Data.Entity.DbContext
{
    public Entities(string scon) : base(scon) { }
}

// my code
public partial class ActivityCodeService
{
    private Entities _context;

    public ActivityCodeService(Entities context)
    {
        this._context = context;
    }
    public ACTIVITY_CODE Update(ACTIVITY_CODE item)
    {
        ACTIVITY_CODE ret = null;
        var found = Read(item.ACT_ID);
        if (found != null)
        {
            _context.Entry<ACTIVITY_CODE>(found).CurrentValues.SetValues(item); // throws InvalidOperationException "No connection string named 'Entities' could be found in the application config file."
            _context.SaveChanges();
            ret = item;
        }
        return ret;
    }
}

// test code
[TestMethod]
public void activity_code_update_test()
{
    // arrange
    var mockSet = new Mock<DbSet<ACTIVITY_CODE>>();
    mockSet.As<IQueryable<ACTIVITY_CODE>>().Setup(o => o.Provider).Returns(testData.Provider);
    mockSet.As<IQueryable<ACTIVITY_CODE>>().Setup(o => o.Expression).Returns(testData.Expression);
    mockSet.As<IQueryable<ACTIVITY_CODE>>().Setup(o => o.ElementType).Returns(testData.ElementType);
    mockSet.As<IQueryable<ACTIVITY_CODE>>().Setup(o => o.GetEnumerator()).Returns(testData.GetEnumerator());

    var mockContext = new Mock<Entities>();
    mockContext.Setup(c => c.ACTIVITY_CODE).Returns(mockSet.Object);

    var expected = new ACTIVITY_CODE() { ACT_ID = 1, ACT_CODE = "code 2", ACT_DESC = "desc 2" };
    var target = new ActivityCodeService(mockContext.Object);

    // act
    target.Update(expected);
}

Entry
不是,也不能被Moq嘲笑,因为它不是虚拟的,所以它仍将尝试使用它认为存在的数据库。这就是它寻找连接字符串的原因

我所能做的工作很好,就是将该函数调用抽象为一个虚拟方法,我有足够的控制权来实际模拟它


备选方案:
有一些工具基于对其他问题的回答,这些问题都有相同的基本问题。看起来TypeMock和JustMock可以解决这个问题

此外,看起来MS Fakes应该能够对其进行填充。经过一点调查,它看起来会像这样工作:

ShimDbEntityEntry<TestModel> entryMock = new ShimDbEntityEntry<TestModel>();
ShimDbPropertyValues mockValues = new ShimDbPropertyValues();
mockValues.SetValuesObject = (newValues) => { }; // Manually do something here
entryMock.CurrentValuesGet = () => mockValues;
ShimDbContext.AllInstances.EntryOf1M0<TestModel>((ctx, target) => entryMock);
ShimdEntityEntryMock=new ShimdEntityEntry();
ShimDbPropertyValues mockValues=新的ShimDbPropertyValues();
mockValues.SetValuesObject=(newValues)=>{};//在这里手动执行某些操作
entryMock.CurrentValuesGet=()=>mockValues;
ShimDbContext.AllInstances.EntryOf1M0((ctx,target)=>entryMock);
ShimDbEntityEntry<TestModel> entryMock = new ShimDbEntityEntry<TestModel>();
ShimDbPropertyValues mockValues = new ShimDbPropertyValues();
mockValues.SetValuesObject = (newValues) => { }; // Manually do something here
entryMock.CurrentValuesGet = () => mockValues;
ShimDbContext.AllInstances.EntryOf1M0<TestModel>((ctx, target) => entryMock);