我已经读过,在使用最小起订量时,您不能模拟非虚函数。我也读过,这应该现在就可以实现。是真的吗?
如果是这样,那么我想模拟以下查询:
DatabaseContext.Database.ExecuteSqlCommand(updateQuery, newValue);
我正在测试中覆盖上下文
DAL.Context.DatabaseContext = mockContext.Object;
我已经尝试过此设置,但查询仍然消失了,我的常规数据库
mockContext.Setup(c => c.Set<AppSalesAndResult>()).Returns(mockBudgetData.Object);
有什么想法,也许可以将executesql命令替换为其他内容,以便上面的行捕获到该集合的所有udpate?由于性能原因,我在一次更新多行时使用executesqlcommand。常规EF太慢
更新:
阅读以下文章How to Moq Entity Framework SqlQuery calls我不知道类似的实现是否对ExecuteSQLCommand有用...
最佳答案
我能够模拟ExecuteSqlCommand所做的事情是在我的DbContext继承中创建相同的方法,但是这次是虚拟的,并调用Database.ExecuteSqlCommand,这是无法在DataBase类中完成的。
public class MyDbContext : DbContext
{
public virtual int ExecuteSqlCommand(string sql, params object[] parameters)
{
return Database.ExecuteSqlCommand(sql, parameters);
}
public virtual int ExecuteSqlCommand(TransactionalBehavior transactionalBehavior, string sql, params object[] parameters)
{
return Database.ExecuteSqlCommand(transactionalBehavior, sql, parameters);
}
然后,我更改了业务代码以调用此创建的方法(非数据库方法):
DatabaseContext.ExecuteSqlCommand(updateQuery, newValue);
然后,它起作用