C# &引用;没有名为'的连接字符串;实体';可以在应用程序配置文件中找到;最小起订量误差
我正在使用Moq为我的oracledb提供模拟上下文。但是当我用模拟的上下文调用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
\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);