При создании модульных тестов для уровня доступа к данным данные должны извлекаться непосредственно из БД, а не из фиктивных объектов.
Примите во внимание следующее:
void IList<Customer> GetCustomers()
{
List<Customer> res = new List<Customer>();
DbCommand cmd = // initialize command
IDataReader r = cmd.ExecuteQuery();
while(r.read())
{
Customer c = ReadFiledsIntoCustomer(r);
res.Add(c);
}
return res;
}
В модульном тесте для GetCustomers должен ли вызов cmd.ExecuteQuery () получить доступ к БД или его поведение должно быть имитировано?
Я считаю, что вы не должны издеваться над фактическим вызовом БД, если выполняется следующее:
Исходя из моего опыта, большое преимущество этого подхода состоит в том, что вы начинаете взаимодействовать с БД на ранней стадии, испытывая «чувство», а не только «внешний вид». Это избавит вас от многих головных болей впоследствии и станет лучшим способом ознакомления со схемой.
Многие могут утверждать, что как только поток выполнения пересекает границы процесса, он становится модульным тестом. Я согласен, что у него есть свои недостатки, особенно когда БД недоступна, а затем вы не можете запустить UT.
Тем не менее, я считаю, что это должно быть правильным делом во многих случаях.
using(WebClient client = new WebClient()) {
string s = client.DownloadString(url);
}