如何使用moq模拟实体框架DbRawSqlQuery对象?

时间:2017-03-06 19:52:40

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

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));

1 个答案:

答案 0 :(得分:1)

示例中的所有类都不能用moq模拟,因为它们是具体的类,并且所讨论的方法不是虚拟的。为了使它更适合测试,抽象出你控制的抽象背后的类。尽量不要模拟你不能控制的接口和类。

上述示例仍然与实施问题DbRawSqlQuery<T>紧密相关。将其与具体结果分开并使其依赖于抽象IEnumerable<T>

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>();