我知道有几个与我的问题类似的问题。
但我认为以上两个问题都没有明确的答案适合我的要求。
现在我正在开发一个新的WebAPI项目,并分离WebAPI项目和DataAccess技术。 我没有问题测试WebAPI控制器,因为我可以模拟数据访问类。
但对于DataAccess类来说就是另一回事了,因为我在其中使用Dapper和内联查询,我有点困惑如何通过使用单元测试来测试它。 我问了一些朋友,他们更喜欢进行集成测试而不是单元测试。
我想知道的是,是否可能对使用Dapper和内联查询的DataAccess类进行单元测试。
假设我有这样一个类(这是一个通用存储库类,因为很多代码都有相似的查询,根据表名和字段区别)
public abstract class Repository<T> : SyncTwoWayXI, IRepository<T> where T : IDatabaseTable
{
public virtual IResult<T> GetItem(String accountName, long id)
{
if (id <= 0) return null;
SqlBuilder builder = new SqlBuilder();
var query = builder.AddTemplate("SELECT /**select**/ /**from**/ /**where**/");
builder.Select(string.Join(",", typeof(T).GetProperties().Where(p => p.CustomAttributes.All(a => a.AttributeType != typeof(SqlMapperExtensions.DapperIgnore))).Select(p => p.Name)));
builder.From(typeof(T).Name);
builder.Where("id = @id", new { id });
builder.Where("accountID = @accountID", new { accountID = accountName });
builder.Where("state != 'DELETED'");
var result = new Result<T>();
var queryResult = sqlConn.Query<T>(query.RawSql, query.Parameters);
if (queryResult == null || !queryResult.Any())
{
result.Message = "No Data Found";
return result;
}
result = new Result<T>(queryResult.ElementAt(0));
return result;
}
// Code for Create, Update and Delete
}
以上代码的实现方式如下:
public class ProductIndex: IDatabaseTable
{
[SqlMapperExtensions.DapperKey]
public Int64 id { get; set; }
public string accountID { get; set; }
public string userID { get; set; }
public string deviceID { get; set; }
public string deviceName { get; set; }
public Int64 transactionID { get; set; }
public string state { get; set; }
public DateTime lastUpdated { get; set; }
public string code { get; set; }
public string description { get; set; }
public float rate { get; set; }
public string taxable { get; set; }
public float cost { get; set; }
public string category { get; set; }
public int? type { get; set; }
}
public class ProductsRepository : Repository<ProductIndex>
{
// ..override Create, Update, Delete method
}
IDbConnection
的抽象表示(因为它已经是一个接口),而是为了能够在存储库内构建新连接。如果您不需要这样做(并且在Web API请求的上下文中可能不需要创建多个连接),则可以直接将IDbConnection
传递给存储库。 - Ignacio CalvoMoq
库,所以var connectionFactoryMock = new Mock<IDatabaseConnectionFactory>();
。 - Mikhail Shilkov