Я знаю, что есть несколько вопросов, похожих на мои.
но я не думаю, что оба вышеуказанных вопроса имеют ясный ответ, соответствующий моему требованию.
Сейчас я разрабатываю новый проект WebAPI и разделяю между проектом WebAPI и технологией DataAccess. У меня нет проблемы с тестированием контроллера для WebAPI, так как я могу издеваться над классом доступа к данным.
Но для класса DataAccess разные истории, так как я использую Dapper с встроенными запросами в нем, я немного запутался, как я могу проверить его, используя Unit Test. Я попросил некоторых из моих друзей, и они предпочитают делать тест интеграции вместо Unit Test.
Я хочу знать, возможно ли unit test класс DataAccess использовать в нем запросы Dapper и Inline.
Скажем, у меня есть класс, подобный этому (это общий класс репозитория, поскольку многие коды имеют похожие запросы, различающиеся по имени и полем таблицы)
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
}