我正在尝试创建一个单元测试来验证加载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
我不确定为什么我不能做这个演员,有什么想法?
答案 0 :(得分:6)
您无法使用Type.IsSubclassOf
查看某个类型是否实现了接口。您必须使用Type.IsAssignableFrom
(或者您可以使用is IEntityMapConfiguration
或Type.GetInterfaces
,然后查看结果序列是否包含typeof(IEntityMapConfiguration)
。
现在想一想为什么你不能使用Type.IsSubclassOf
来查看Type
是否实现了一个接口。因为我们没有说实现接口的类是该接口的子类;相反,我们说实现接口,我们保留是的子类,用于其基类(object
或ValueType
,除非指定了一个)
顺便说一下,Type.IsSubclassOf
的文档中明确明确:
IsSubclassOf
方法不能用于确定接口是从另一个接口派生,还是类是否实现接口。
答案 1 :(得分:3)
使用IsAssignableFrom()
来自MSDN:
IsSubclassOf方法不能用于确定接口是从另一个接口派生,还是用于实现接口。