2017-03-06 116 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

謝謝恩科西。其作品。 –