В прошлом, когда я реализовывал модульные тесты, я изо всех сил пытался настроить «приличные» модульные тесты для слоев доступа к данным, потому что они часто имеют базу данных в качестве внешней зависимости. В идеальном мире я бы издевался над вызовами хранимых процедур, чтобы удалить внешнюю зависимость.
Однако мне не удалось понять, как это сделать с помощью MOQ mocking framework, или найти любую другую инфраструктуру, которая это поддерживает. Вместо этого я вернулся к созданию тестовой базы данных по сценарию с известными данными (чтобы я всегда мог получить ожидаемые результаты), но это немного отличается от имитации этого слоя.
Может ли кто-нибудь предложить, как смоделировать эту часть уровня доступа к данным [я знаю, что для Entity Framework https://effort.codeplex.com/ существует]?
Подробности Например, если у меня есть следующий метод
public object RunStoredProc()
{
//Some Setup
using (SqlConnection conn = new SqlConnection(CONNNECTION_STRING))
{
using (SqlCommand comm = new SqlCommand("storedProcName", conn))
{
conn.Open();
comm.CommandType = CommandType.StoredProcedure;
using (SqlDataReader reader = comm.ExecuteReader())
{
while (reader.Read())
{
//Logic
}
}
}
}
//Return object based on logic
}
тогда как мне смоделировать вывод хранимой процедуры, чтобы SQLDataReader
содержал указанные данные. На более высоком уровне я мог бы имитировать метод RunStoredProc()
, но это не поможет мне проверить правильность логики этого метода. В качестве альтернативы я мог бы выделить SQLReader
другим методом.
public object RunStoredProc()
{
//Some Setup
List<object> data = GetData();
//Logic
//Return object based on logic
}
private List<object> GetData()
{
using (SqlConnection conn = new SqlConnection(CONNNECTION_STRING))
{
using (SqlCommand comm = new SqlCommand("storedProcName", conn))
{
conn.Open();
comm.CommandType = CommandType.StoredProcedure;
using (SqlDataReader reader = comm.ExecuteReader())
{
while (reader.Read())
{
//place into return object
}
}
}
}
}
но поскольку метод «GetData» должен быть закрытым (не частью опубликованного интерфейса), я тогда не смогу издеваться над этим, и поэтому проблема остается.