Я хочу реорганизовать DLL, чтобы сделать его MEFable тоже. Должен ли я модуль проверить, декорирован ли класс с помощью атрибутов [Экспорт] или [Импорт] и других атрибутов MEF?Следует ли тестировать класс для атрибутов MEF?
2
A
ответ
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. Мы просто называем их «композиционными испытаниями».
Смежные вопросы
- 1. Следует ли тестировать классы моделей?
- 2. Следует ли тестировать все классы?
- 3. Следует ли тестировать внутренние классы?
- 4. Следует ли тестировать ручные кодировки?
- 5. Следует ли тестировать модели Django?
- 6. Следует ли тестировать @Entity Pojos?
- 7. Следует ли тестировать внутреннюю реализацию или тестировать общественное поведение?
- 8. Где следует тестировать проекты?
- 9. MEF Импорт атрибутов
- 10. Следует ли тестировать DAO (aka Repositories)?
- 11. C# Как правильно тестировать класс, который следует за шаблоном декоратора?
- 12. Следует ли тестировать/издеваться над методами, содержащими выражения LINQ?
- 13. Стандартные валидаторы домена Grails: следует ли тестировать или нет?
- 14. Как определить, можно ли тестировать существующий класс?
- 15. Должен ли я тестировать этот класс?
- 16. Следует ли использовать класс формы?
- 17. Следует ли тестировать статические заводы при выполнении TDD?
- 18. Как следует тестировать внутренние классы и методы?
- 19. Класс подключения, следует ли использовать Singleton?
- 20. Следует ли тестировать внешнюю систему перед ее использованием?
- 21. Рекомендации по слиянию и тестированию, следует ли тестировать больше?
- 22. Следует ли тестировать объекты домена и простые JavaBeans?
- 23. Следует ли тестировать контроллеры в веб-приложениях MVC?
- 24. Где следует тестировать классы в проекте?
- 25. Почему одноэлементный класс трудно тестировать?
- 26. Как тестировать (TDD) одноэлементный класс?
- 27. Должны ли «тестировать» среды «тестировать» внешние службы?
- 28. Следует ли использовать управляемую расширяемую структуру для использования внешних плагинов?
- 29. Можно ли тестировать класс, который вызывает вызовы P/Invoke?
- 30. Следует ли объявлять класс приемника публичным?
хорошо, я думаю, когда я делаю модульный тест, тогда я просто хочу знать, что мой класс (единица) ведет себя как ожидалось. я действительно не хочу тестировать сочинение, так что MEF работает так, как ожидалось. для моей части кода я просто должен гарантировать, что атрибуты установлены. если во время выполнения компоновка не удовлетворяла мой импорт или экспорт, это не проблема моего класса (единицы). Вы с этим согласны? – blindmeis
@blindmeis: Я не согласен. Атрибуты MEF являются метаданными, которые имеют отношение только к интеграции. Вы пытаетесь включить проблемы интеграции в единичный тест, который не подходит. Представьте, что вы изменяете тип контракта во всех импортах, но забудьте изменить экспорт в тестируемый класс. Тест устройства не обнаружит этого: он будет продолжать проверять наличие неправильного атрибута экспорта. Мой тест обнаружит несоответствие. –
Вы правы в своих тестах на композицию. но я вижу, что мой модульный тест - это то, что это единичный тест. поэтому, если я сменю контракт, блок, в котором я сделаю это изменение, потерпит неудачу, и он должен. но тогда я знаю, что это требует прав, и поэтому я должен изменить свой модульный тест. я вижу, что ваш анализ состава необходим, но на более высоком уровне, чем единичный тест. Кстати, я только что сделал тест, потому что я пытаюсь узнать путь tdd. И там у меня было требование, чтобы мой класс был поддающимся проверке. – blindmeis