Несколько недель назад я запрыгнул на платформу MEF (ComponentModel) и теперь использую ее для многих своих плагинов, а также для общих библиотек. В целом, это было здорово, если не считать частых ошибок с моей стороны, которые приводят к срыву отладочных сессий.
Как бы то ни было, мое приложение работало отлично, но изменения кода, связанные с MEF, привели к сбою моих автоматических сборок. Большинство моих модульных тестов проваливались просто потому, что модули, которые я тестировал, зависели от других модулей, которые должны были быть загружены MEF. Я обходил эти ситуации, обходя MEF и непосредственно создавая экземпляры этих объектов.
Другими словами, через MEF у меня будет что-то вроде
[Import]
public ICandyInterface ci { get; set; }
и
[Export(typeof(ICandyInterface))]
public class MyCandy : ICandyInterface
{
[ImportingConstructor]
public MyCandy( [Import("name_param")] string name) {}
...
}
Но в моих юнит-тестах я бы просто использовал
CandyInterface MyCandy = new CandyInterface( "Godiva");
Кроме того, CandyInterface требует подключения к базе данных, что я обошел, просто добавив тестовую базу данных в мою папку модульных тестов, и я использую NUnit для всех тестов.
Хорошо, вот мои вопросы относительно этой ситуации:
- Это плохой способ делать вещи?
- Вы бы порекомендовали составлять детали в [SetUp]
- Я еще не научился использовать макеты в модульном тестировании - это хороший пример случая, когда я мог бы захотеть смоделировать базовое соединение с базой данных (каким-то образом), чтобы просто вернуть фиктивные данные и на самом деле не требовать базы данных
- Если вы уже сталкивались с чем-то подобным, можете ли вы предложить свой опыт и то, как вы решили свою проблему? (или это должно войти в сообщество вики?)