具体例のクラスは具体的なクラスであり、問題のメソッドは仮想ではないため、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>();
hmm。テストしたいコードはどのように見えますか?あなたは何をテストしたいですか?私はそれが問題だと思う。あなたの質問への答えは、インターフェイスまたは抽象クラスを追加する必要があるということです。しかし、それを文脈に入れるためには、より多くの情報が必要です。 – Jocke