Почему мой класс не воспринимается с помощью размышлений? - PullRequest
0 голосов
/ 27 августа 2011

Я пытаюсь создать модульный тест, чтобы убедиться, что мой метод загрузки конфигураций 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

Я не уверен, почему я не могу сделать этот актерский состав, какие-либо идеи?

Ответы [ 2 ]

6 голосов
/ 27 августа 2011

Вы не можете использовать Type.IsSubclassOf, чтобы увидеть, реализует ли тип интерфейс.Вы должны использовать Type.IsAssignableFrom (или вы можете использовать is IEntityMapConfiguration или Type.GetInterfaces, а затем посмотреть, содержит ли результирующая последовательность typeof(IEntityMapConfiguration).

Теперь подумайте, почему вы можете 't Type.IsSubclassOf, чтобы увидеть, реализует ли интерфейс Type, потому что мы не говорим, что класс, реализующий интерфейс, является подклассом этого интерфейса, вместо этого мы говорим, что он реализует интерфейс.и мы резервируем подкласс для его базового класса (object или ValueType, если не указан один).

Кстати, это ясно изложенные в документации для Type.IsSubclassOf:

Метод IsSubclassOf нельзя использовать для определения того, является ли интерфейс производным от другого интерфейса или класс реализует интерфейс.

3 голосов
/ 27 августа 2011

Использовать IsAssignableFrom ()

Из MSDN:

Метод IsSubclassOf нельзя использовать для определения того, является ли интерфейс производным от другого интерфейса или класс реализует интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...