Классическое решение, если у вас есть конкретная реализация зависимости в классе, который вы хотите протестировать: добавьте слой косвенности, где вы полностью контролируете.Единичные тесты: где остановиться?
Итак, речь идет о добавлении большего количества слоев косвенности (интерфейсы, которые могут быть окурками/макетами в модульных тестах).
Но: где-то в моих тестах у меня должна быть «реальная» реализация моей зависимости. Так что насчет этого? Контрольная работа? Не тестировать?
Возьмем такой пример:
У меня были некоторые зависимости на пути, которые мне нужно в моем приложении. Поэтому я извлек интерфейс, IPathProvider
(что я могу подделать в своих тестах). Вот реализация:
public interface IPathProvider
{
string AppInstallationFolder { get; }
string SystemCommonApplicationDataFolder { get; }
}
Конкретное PathProvider
выглядит следующим образом:
public class PathProvider : IPathProvider
{
private string _appInstallationFolder;
private string _systemCommonApplicationDataFolder;
public string AppInstallationFolder
{
get
{
if (_appInstallationFolder == null)
{
try
{
_appInstallationFolder =
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
}
catch (Exception ex)
{
throw new MyException("Error reading Application-Installation-Path.", ex);
}
}
return _appInstallationFolder;
}
}
public string SystemCommonApplicationDataFolder
{
get
{
if (_systemCommonApplicationDataFolder == null)
{
try
{
_systemCommonApplicationDataFolder =
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
}
catch (Exception ex)
{
throw new MyException("Error reading System Common Application Data Path.", ex);
}
}
return _systemCommonApplicationDataFolder;
}
}
}
проверить ли вы такой код, и если, как?
Вот несколько продуктов для размышлений об модульных тестах: http://www.rbcs-us.com/documents/Why-Most-Unit-Testing-is-Waste.pdf –