1

現在、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"]))

...

それをどうするかはまだわかりませんが、関連しているように見えました。

4

1 に答える 1

0

AutoMapperBootstrapper.Initialize単体テストから呼び出すと思いますが、マッピング構成がある唯一の場所はConfigureMappingsですか? 私はあなたの問題を説明することはできませんが、ユニットテストの間に漏れがあることは明らかです。私は同様のセットアップを持っています、そしてこれは私がしていることです...

私の初期化コードは

public static class MappingConfiguration
{
    public static void RegisterMappings()
    {
        Mapper.Initialize(x =>
            {
                x.AddProfile<MapperProfileOne>();
                x.AddProfile<MapperProfileTwo>();
            });
    }
}

これはアプリケーションによってのみ呼び出されます (RegisterMappings単一のInitialize呼び出ししかないため、メソッドをテストする必要はありません。動作することを信頼してAutoMapperいます。私の単体テスト (マッピング構成をテストするため) は次のとおりです。

[Test]
public void Initialise_ProfileOne_GeneratesNoErrors()
{
    Mapper.Initialize(x => x.AddProfile<MapperProfileOne>());
    Mapper.AssertConfigurationIsValid();
}

[Test]
public void Initialise_ProfileTwo_GeneratesNoErrors()
{
    Mapper.Initialize(x => x.AddProfile<MapperProfileTwo>());
    Mapper.AssertConfigurationIsValid();
}

プロファイルの例は次のとおりです。

public class MapperProfileOne : Profile
{
    protected override void Configure()
    {
        Mapper.CreateMap<Source, Destination>();
    }
}

AutoMapperBootstrapper単体テストからメソッドを呼び出している場合、どういうわけか混乱しているのではないかと思っています(質問には、これを特定するのに十分な詳細がありません)。そうすべきではないと思いますが、上記のコードの中に、問題を魔法のように解決してくれる何かが少なくともあることを願っています。

于 2013-04-18T02:38:22.017 に答える