現在、MSTest ランナーを使用した約 1000 のユニット/統合テストのソリューションがあります。AutoMapper で発生している問題は、VS でソリューション内のすべてのテストを実行すると、次の automapper 例外が原因でいくつかの単体テストがランダムに失敗することです。
AutoMapper.AutoMapperMappingException:
Mapping types:
String -> String
System.String -> System.String
Destination path:
CatalogResource.CultureCode
Source value:
en-US ---> System.InvalidCastException: Unable to cast object of type 'Model.Catalog' to type 'Model.CatalogResource'.
コードでは、カタログからカタログリソースへのマップがありませんし、それらを互いにマップしようとしてもいません。このタイプの例外は、PROD では発生せず、統合テストでも発生せず、テストを実行するたびに発生するわけではなく、発生した場合、失敗するのは常に異なるテストです。また、失敗したばかりのテストのみを実行すると、常に成功します。これをローカルで一貫して再現するのに苦労していますが、ビルドサーバーでより頻繁に発生します。これは、ビルドが次の環境に自動的に昇格するのを妨げるため、苦痛です.
これもテストに追加しようとしましたが、問題は解決しませんでした:
[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
Mapper.Reset();
}
何か案は?私たちは4人の異なる人々にこれを刺して無駄にさせたので、私は今あなたの素晴らしい人々に助けを求めています.
ありがとう!
編集:
現在、サービスの静的コンストラクター内で呼び出される静的クラスを使用して構成を初期化しています。IE
static MyService()
{
AutoMapperBootstrapper.Initialize();
}
...
internal static class AutoMapperBootstrapper
{
public static void Initialize()
{
ConfigureMappings();
#if DEBUG
Mapper.AssertConfigurationIsValid();
#endif
}
}
編集#2:
今日、さらにいじくり回すうちに、これらのランダムな障害が<IDataReader, something else>
マップでのみ発生することに気付きました。例えば:
Mapper.CreateMap<IDataReader, Catalog>()
.ForMember(m => m.CatalogID, opt => opt.MapFrom(src => src["CatalogID"]))
.ForMember(m => m.Title, opt => opt.MapFrom(src => src["Title"]))
.ForMember(m => m.DateCreatedUTC, opt => opt.MapFrom(src => src["DateCreatedUTC"]))
.ForMember(m => m.DateModifiedUTC, opt => opt.MapFrom(src => src["DateModifiedUTC"]))
...
それをどうするかはまだわかりませんが、関連しているように見えました。