问题描述
||
我有一个自定义类型转换器,该转换器将UTC DateTime属性转换为公司的本地时间(在这里讨论:使用AutoMapper全局应用值解析器)。
现在,如果视图模型的属性标记有自定义
displayInLocalTime
属性,则我只希望此转换器执行其操作。
在类型转换器内部,如果实现原始的ITypeConvert<TSource,TDestination>
接口,则可以检查要转换的目标视图模型属性是否具有以下属性:
public class LocalizedDateTimeConverter : ITypeConverter<DateTime,DateTime>
{
public DateTime Convert(ResolutionContext context)
{
var shouldConvert = context.Parent.DestinationType
.GetProperty(context.MemberName)
.GetCustomAttributes(false)[0].GetType() == typeof(displayInLocalTimeAttribute);
if (shouldConvert) {
// rest of the conversion logic...
}
}
}
因此,此代码工作得很好(显然,那里有更多的错误检查和变量,以提高可读性)。
我的问题:
这是解决这个问题的正确方法吗?我还没有在AutoMapper代码库中发现任何乱搞或乱写的东西。
我将如何对此进行单元测试?我可以在传递的ResolutionContext
上设置父目标类型,但有点怪癖,但是不能设置成员名称,因为IMemberAccessor
的所有实现者都在AutoMapper内部。这以及设置非常丑陋的事实,使我对此并没有真正的支持,或者我正在做错所有事情。
我正在使用最新的TeamMity版本的AutoMapper BTW。
解决方法
不要对此进行单元测试,请使用集成测试。只需编写一个实际调用AutoMapper的映射测试,即可从外部验证此类型转换器支持的任何用例。
通常,对别人的API扩展点进行单元测试对我来说没有太大的价值。相反,我尝试穿过前门,并确保正确配置了扩展点。