Я стараюсь использовать ядро DI непосредственно в своем коде как можно меньше, вместо этого полагаясь на инжектор конструктора (или свойства в некоторых случаях, таких как Attribute
классы). Однако там, где я должен, я использую уровень абстракции, чтобы я мог установить объект ядра DI, делая его пригодным для использования в модульных тестах.
Например:
public interface IDependencyResolver : IDisposable
{
T GetImplementationOf<T>();
}
public static class DependencyResolver
{
private static IDependencyResolver s_resolver;
public static T GetImplementationOf<T>()
{
return s_resolver.GetImplementationOf<T>();
}
public static void RegisterResolver( IDependencyResolver resolver )
{
s_resolver = resolver;
}
public static void DisposeResolver()
{
s_resolver.Dispose();
}
}
Используя такой шаблон, вы можете установить IDependencyResolver
из модульных тестов, вызвав RegisterResolver
с фиктивной или поддельной реализацией, которая возвращает любые объекты, которые вы хотите, без необходимости подключения полных модулей. Это также имеет дополнительное преимущество - абстрагирование вашего кода от конкретного контейнера IoC, если вы решите в будущем переключиться на другой.
Естественно, вы также захотите добавить дополнительные методы к IDependencyResolver
, как того требуют ваши потребности, я просто привожу здесь основы в качестве примера. Да, тогда потребуется написать супер простую оболочку вокруг ядра Ninject, которая также реализует IDependencyResolver
.
Причина, по которой вы хотите это сделать, заключается в том, что ваши модульные тесты должны на самом деле тестировать только одну вещь, и, используя ваш реальный контейнер IoC, вы действительно выполняете больше, чем один тестируемый класс, что может привести к ложным негативам, которые сделать ваши тесты хрупкими и (что более важно) поколебать веру разработчиков в их точность с течением времени. Это может привести к апатии и отказу от тестов, так как становится возможным провал тестов, но программное обеспечение по-прежнему работает правильно («не волнуйтесь, это всегда сбой, это не имеет большого значения»).