2016-05-31 2 views
0

Я пытаюсь мотивировать свою команду, чтобы повысить наши навыки развития, следуя TDD. Это замечательный опыт, но в некоторых случаях я заметил, что большинство из них перестали делать это из-за проблем ниже:Как следовать принципам TDD с использованием классов с использованием фабрик

1/Мы разрабатываем «брокеры», которые срабатывают, когда что-то происходит и предназначено для выполнения набора действий (отправлять электронные письма, обрабатывать данные, конвертировать файлы ...).

2/Все брокеры загружаются, когда приложение начинается с простого Activator.CreateInstance(brokerType).

3/Один из наших брокеров должен извлечь записи из файла excel и попытаться найти связанные записи в БД. Для этого мы используем только код ниже:

public void Process(string file) 
{ 
    using (var sun = new SunSystemExcelDataSource(ExcelDatasourceFactory.Create(file))) 
    {//...} 
} 

Этот код вызывает завод возвращающегося класс (унаследовав от IExcelSource), способный анализировать указанный первенствует файл (XLS против XLSX), а затем он передается в качестве параметра к конструктору SunSystemExcelDataSource.

Вопрос: Этот метод едва ли можно проверить. Мне было интересно, можете ли вы дать нам несколько советов по улучшению возможностей тестирования кода.

Вообще говоря, как проходят тесты, которые полагаются на фабрики, чтобы строить себя?

Код:

public void Initialize(ILog log, AppSettings settings) 
{ 
    _log = log; 
    _hrdb = DbDatasourceFactory.CreateHrdbDatasource(settings.HrdbConnectionString); 
    _processor = new K2Processor(settings.SettlePaymentWorkflow); 
    _sunFolderPath = settings.SunSystemExcelFolderPath; 
} 
+5

Завод не должен быть статический тип, но получить зависимость инъекции, а также , Таким образом, вы также издеваетесь над Factory, который затем возвращает тестируемый объект. –

+0

Microsoft shims and fakes могут издеваться над статическими методами. Мы можем использовать это, –

ответ

0

Moq библиотека не поддерживает статические методы. Но мы можем использовать Microsoft Shims и Fakes.

https://msdn.microsoft.com/en-us/library/hh549175.aspx

Мы все еще можем использовать Moq, но для этого мы должны изменить код, чтобы что-то вроде этого,

public void Initialize(ILog log, AppSettings settings) 
{ 
    Initialize(log, settings, DbDatasourceFactory.CreateHrdbDatasource(settings.HrdbConnectionString); 
} 

// Unit-test this method, 
internal void Initialize(ILog log, AppSettings settings, HrdbDataSource hrdbDataSource) 
{ 
    _log = log; 
    _hrdb = hrdbDataSource; 
    _processor = new K2Processor(settings.SettlePaymentWorkflow); 
    _sunFolderPath = settings.SunSystemExcelFolderPath; 
}