Moq 实体框架 ExecuteSQLCommand

Joh*_*son 8 c# entity-framework moq

我读过使用 moq 时不能模拟非虚拟函数。我也读到这现在应该是可能的..这是真的吗?如果是这样,那么我想模拟以下查询:

DatabaseContext.Database.ExecuteSqlCommand(updateQuery, newValue);
Run Code Online (Sandbox Code Playgroud)

我在我的测试中覆盖了上下文

DAL.Context.DatabaseContext = mockContext.Object;
Run Code Online (Sandbox Code Playgroud)

我试过这个设置,但似乎查询仍然重复我的常规数据库

mockContext.Setup(c => c.Set<AppSalesAndResult>()).Returns(mockBudgetData.Object);
Run Code Online (Sandbox Code Playgroud)

任何想法,也许可以用其他东西替换executesqlcommand,以便上面的行可以捕获该集合的任何更新?由于性能原因,我在一次更新多行时使用 executesqlcommand。普通EF太慢

更新:

阅读下面的文章,How to Moq Entity Framework SqlQuery call我想知道类似的实现是否适用于 ExecuteSQLCommand...

mqu*_*eia 11

我所做的是能够模拟 ExecuteSqlCommand,这在 DataBase 类中是不可能的,是在我的 DbContext 继承中创建相同的方法,但这次是虚拟的,并调用 Database.ExecuteSqlCommand

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);
    }
Run Code Online (Sandbox Code Playgroud)

然后我改变了我的业务代码来调用这个创建的方法(不是数据库方法):

DatabaseContext.ExecuteSqlCommand(updateQuery, newValue);
Run Code Online (Sandbox Code Playgroud)

然后,它工作