Я пытаюсь создать модульный тест, чтобы убедиться, что мой метод загрузки конфигураций AutoMapper работает правильно.Моя идея загрузить конфигурации AutoMapper - поместить вызовы конфигурации в классы со следующим интерфейсом:
public interface IEntityMapConfiguration
{
void ConfigureMapping();
}
Для их динамической загрузки у меня есть следующий класс загрузчика
public class EntityMapLoader
{
public static void LoadEntityMappings()
{
// Load all IEntityMapConfiguration classes via reflection
var types = AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(x => x.GetTypes())
.Where(x => x.IsSubclassOf(typeof(IEntityMapConfiguration)))
.Select(x => x as IEntityMapConfiguration)
.ToList();
foreach (var config in types)
config.ConfigureMapping();
}
}
Для проверкидля этого я создал следующий модульный тест
public class UnitTestEntityViewModel
{
public int Id { get; set; }
public int Text2 { get; set; }
}
public class TestProjectionMapping : IEntityMapConfiguration
{
public void ConfigureMapping()
{
Mapper.CreateMap<UnitTestEntity, UnitTestEntityViewModel>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.Text2, opt => opt.MapFrom(src => src.Text));
}
}
[TestClass]
public class AutomapperConfigurationTests
{
[TestMethod]
public void Loader_Loads_All_Configurations_In_Assembly()
{
// Setup
UnitTestEntity entity = new UnitTestEntity { Id = 2, Text = "Test 1234" };
// Act
EntityMapLoader.LoadEntityMappings();
// Verify
UnitTestEntityViewModel result = Mapper.Map<UnitTestEntity, UnitTestEntityViewModel>(entity);
Assert.AreEqual(entity.Id, result.Id, "View model's ID value did not match");
Assert.AreEqual(entity.Text, result.Text2, "View model's text value did not match");
}
}
Проблема в том, что этот модульный тест не пройден, потому что он не отвечает на мой класс TestProjectionMapping
, и я не могу понять, почему.В моем LoadEntityMappings()
списке types
есть счетчик нуля.Я подтвердил, что моя тестовая сборка возвращается из AppDomain.CurrentDomain.GetAssemblies()
.
Я уверен, что я делаю что-то явно не так, но не могу найти это.Любые идеи?
Редактировать : я обновил мой LoadentityMappings()
метод, чтобы он был:
public static void LoadEntityMappings()
{
// Load all IEntityMapConfiguration classes via reflection
var types = AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(x => x.GetTypes())
.Where(x => x.GetInterfaces().Contains(typeof(IEntityMapConfiguration)))
.Select(x => x as IEntityMapConfiguration)
.ToList();
foreach (var config in types)
config.ConfigureMapping();
}
Это все еще не удается.Оператор (без окончательного выбора) возвращает мой класс TestProjectionMapping
, но x as IEntityMapconfiguration
терпит неудачу.В отладчике, когда я набираю (IEntityMapConfiguration)types[0]
, я получаю следующую ошибку:
Cannot cast 'types[0]' (which has an actual type of 'System.RuntimeType') to 'MyJobLeads.DomainModel.EntityMapping.IEntityMapConfiguration'
Для справки в списке наблюдения, набрав types[0]
показывает:
types[0] {Name = "TestProjectionMapping" FullName = "MyJobLeads.Tests.TestProjectionMapping"} System.Type {System.RuntimeType}
Кроме того, types[0] is IEntityMapConfiguration
- это false
Я не уверен, почему я не могу сделать этот актерский состав, какие-либо идеи?