Создайте ILogger, используя имя класса C# для инициализации класса службы xUnit.C#

Место общения программистов C#
Ответить
Anonymous
 Создайте ILogger, используя имя класса C# для инициализации класса службы xUnit.

Сообщение Anonymous »

У меня есть большой проект с сотнями файлов классов C#. Необходимо написать тесты xUnit для функций сервисов, которые зависят от множества аргументов и могут быть зависимости этих классов друг от друга. В некоторых случаях конструктору требуется ILogger. Инициализация этих зависимостей для запуска тестов занимает много времени.
Есть ли способ создать ILogger на основе имени класса, полученного посредством отражения параметров?
1 – Получить необходимые параметры

Код: Выделить всё

public static object CreateInstance(Type type, Assembly[] assemblies)
{
try
{
var constructor = type.GetConstructors().FirstOrDefault();
if (constructor == null)
{
throw new InvalidOperationException($"No public constructor found for type {type.FullName}");
}

var parameters = constructor.GetParameters();
var parameterInstances = parameters.Select(p => ResolveDependency(p.ParameterType, assemblies)).ToArray();

return constructor.Invoke(parameterInstances);
}
catch (Exception ex)
{
throw;
}
}
2 – Устранение зависимостей

Код: Выделить всё

private static object ResolveDependency(Type type, Assembly[] assemblies)
{
if (type.Name.IndexOf("IMapper") > -1)
{
return AutoMapperConfig.GetMapper();
}

if (type.Name.IndexOf("ILogger") > -1)
{
try
{
var typeArg = type.GetGenericArguments()[0];
var entityType = FindTypeByName(typeArg.Name, assemblies);
return LoggerFactory.CreateLogger();
}
catch (Exception ex1)
{
throw;
}
}

foreach (var assembly in assemblies)
{
var implementationType = assembly.GetTypes().FirstOrDefault(t => type.IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);
if (implementationType != null)
{
return CreateInstance(implementationType, assemblies);
}
}

throw new InvalidOperationException($"No implementation found for type {type.FullName}");
}
3 — Экземпляр регистратора — сбой

Код: Выделить всё

public static object CreateILogger(Type type)
{
var genericType = typeof(Logger).MakeGenericType(type);
return Activator.CreateInstance(genericType);
}
Моя цель состоит в том, чтобы по каждому классу обслуживания я звонил

Код: Выделить всё

var myService = ServiceInitializer.Initialize(MyService);
Базовая функция «Initialize» соберет необходимые параметры, пройдёт до последнего и инициализирует их. Я явно игнорирую все библиотеки DLL, кроме тех, которые написаны нами.
Возможно, я выбрал неправильный подход к написанию тестов XUnit, ваши предложения очень нужны, просто имейте в виду, что я хочу избавьтесь от инициализации n числа классов для одного тестируемого сервиса.

Подробнее здесь: https://stackoverflow.com/questions/787 ... tializatio
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»