2017-03-06 114 views
1
var parentid = uow.SqlQuery<int?>("select query", new SqlParameter("Id", Id)); 

uow是工作单元的对象。如何使用moq模拟实体框架DbRawSqlQuery对象?

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

hmm。你想测试的代码是怎样的?你想测试什么?我认为这是个问题。你的问题的答案是你需要添加一个接口或抽象类。但要把它放在背景下,我们需要更多的信息。 – Jocke

回答

1

在实施例中的类中没有一个是与mockable 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>(); 
+0

谢谢恩科西。其作品。 –