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

は、作業単位のオブジェクトです。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

具体例のクラスは具体的なクラスであり、問​​題のメソッドは仮想ではないため、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 
} 

実装はテストするときだから今IUnitOfWorkが簡単に選択のあなたのモックフレームワークを嘲笑することができ結石

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

をラップします。

var mock = new Mock<IUnitOfWork>(); 
+0

ありがとうございました。それは作品です。 –

関連する問題