【问题标题】:How to mock entity framework DbRawSqlQuery object using moq?如何使用 moq 模拟实体框架 DbRawSqlQuery 对象?
【发布时间】:2017-03-06 19:52:39
【问题描述】:
var parentid = uow.SqlQuery<int?>("select query", new SqlParameter("Id", Id));

uow 是工作单元的对象。

SqlQuery方法如下:

public DbRawSqlQuery<T> SqlQuery<T>(string query, params object[] parameters)
{
    return context.Database.SqlQuery<T>(query, parameters);
}

如何在 C# 中模拟下面的代码?

var parentid = uow.SqlQuery<int?>("select query", new SqlParameter("Id", Id));

【问题讨论】:

  • 嗯。您要测试的代码是什么样的?你想测试什么?我认为这就是问题所在。您的问题的答案是您需要添加一个接口或抽象类。但为了说明这一点,我们需要更多信息。

标签: c# entity-framework unit-testing mocking moq


【解决方案1】:

示例中的所有类都不能使用 moq 进行模拟,因为它们是具体类并且所讨论的方法不是虚拟的。为了使其对测试更加友好,请在您控制的抽象后面抽象那些类。尽量不要模拟您无法控制的接口和类。

上面的例子仍然与实现问题紧密耦合DbRawSqlQuery&lt;T&gt;。将其与凝结物分开并使其依赖于抽象IEnumerable&lt;T&gt;

public interface IExecuteSql {
    int ExecuteSqlCommand(string sql, params object[] parameters);
    IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters);
}

public interface IUnitOfWork : IExecuteSql, //...other interfaces
{
    //...other code removed for brevity
}

实现将包裹混凝土

public class EntityFrameworkUnitOfWork : IUnitOfWork {

    //...other code removed for brevity

    public int ExecuteSqlCommand(string sql, params object[] parameters) {
        return context.Database.ExecuteSqlCommand(sql, parameters);
    }

    public IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters) {
        return context.Database.SqlQuery<TElement>(sql, parameters);
    }
}

所以现在在测试 IUnitOfWork 时可以轻松地使用您选择的模拟框架进行模拟。

var mock = new Mock<IUnitOfWork>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2019-01-08
    • 2019-07-07
    • 1970-01-01
    • 2011-01-28
    • 2014-08-02
    相关资源
    最近更新 更多