如何使用最小起订量模拟 entity framework DbRawSqlQuery 对象?
How to mock entity framework DbRawSqlQuery object using 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));
示例中 类 的 None 可以用最小起订量模拟,因为它们是具体的 类 并且所讨论的方法不是虚拟的。为了使其更易于测试,将那些 类 抽象在你控制的抽象背后。尽量不要模拟您无法控制的接口和 类。
上面的示例仍然与实现问题紧密耦合 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>();
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));
None 可以用最小起订量模拟,因为它们是具体的 类 并且所讨论的方法不是虚拟的。为了使其更易于测试,将那些 类 抽象在你控制的抽象背后。尽量不要模拟您无法控制的接口和 类。
上面的示例仍然与实现问题紧密耦合 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>();