2010-08-10 7 views

ответ

1

Подумав несколько часов и прочитав несколько дневников TDD, я должен сказать: ДА, мне нужно проверить, есть ли у моего класса атрибуты MEF или нет.

Так что перед рефакторингом моих занятий я писать тесты таким образом:

[TestClass] 
public class When_SampleClass_mefable 
{ 
    [TestMethod] 
    [TestCategory("LFF.Kabu.Win.Login.ViewModel.SampleClass")] 
    public void Should_SampleClass_be_marked_with_Export_Attibute() 
    { 
     //arrange 
     var info = (typeof (SampleClass)); 

     //act 
     var attr = info.GetCustomAttributes(true); 

     var hasExportAttribute = 
      attr.Where(x => x.GetType() == typeof (ExportAttribute)) 
       .Where(x => ((ExportAttribute)x).ContractType == typeof(SampleClass)) 
       .Count() > 0; 
     //assert 
     Assert.IsTrue(hasExportAttribute, "SampleClass is not marked with Export."); 
    } 
} 

Для другого MEF атрибуты, как [ImportingConstructor] или [PartCreationPolicy] я сделать это таким же образом.

3

Ваши тесты должны быть направлены скорее на цель вместо механизма. Создание тестов, которые проверяют такие вещи, как «, если я бросаю типов X, Y и Z вместе в контейнере, то я могу вытащить интерфейс IFoo из контейнера», как это:

[Test] 
public void Can_get_IFoo_from_container_with_Foo_Bar_Baz() 
{ 
    var catalog = new TypeCatalog(typeof(Foo), typeof(Bar), typeof(Baz)); 
    using (var container = new CompositionContainer(catalog)) 
    { 
     var test = container.GetExportedValue<IFoo>(); 
    } 
} 

Это больше не является реальный «единичный» тест, поскольку он включает в себя несколько классов и контейнер IoC. Мы просто называем их «композиционными испытаниями».

+0

хорошо, я думаю, когда я делаю модульный тест, тогда я просто хочу знать, что мой класс (единица) ведет себя как ожидалось. я действительно не хочу тестировать сочинение, так что MEF работает так, как ожидалось. для моей части кода я просто должен гарантировать, что атрибуты установлены. если во время выполнения компоновка не удовлетворяла мой импорт или экспорт, это не проблема моего класса (единицы). Вы с этим согласны? – blindmeis

+0

@blindmeis: Я не согласен. Атрибуты MEF являются метаданными, которые имеют отношение только к интеграции. Вы пытаетесь включить проблемы интеграции в единичный тест, который не подходит. Представьте, что вы изменяете тип контракта во всех импортах, но забудьте изменить экспорт в тестируемый класс. Тест устройства не обнаружит этого: он будет продолжать проверять наличие неправильного атрибута экспорта. Мой тест обнаружит несоответствие. –

+0

Вы правы в своих тестах на композицию. но я вижу, что мой модульный тест - это то, что это единичный тест. поэтому, если я сменю контракт, блок, в котором я сделаю это изменение, потерпит неудачу, и он должен. но тогда я знаю, что это требует прав, и поэтому я должен изменить свой модульный тест. я вижу, что ваш анализ состава необходим, но на более высоком уровне, чем единичный тест. Кстати, я только что сделал тест, потому что я пытаюсь узнать путь tdd. И там у меня было требование, чтобы мой класс был поддающимся проверке. – blindmeis

Смежные вопросы