2015-09-09 37 views
6

私たちのサービスでAutoMapperを実装しようとしていて、単体テストで非常に混乱する問題があります。子クラスが要求されたときにAutomapperが親クラスへマッピングされないようにする方法

まず第一に、この問題は、次のオブジェクトとそれぞれのマップが含まれます。

public class DbAccount : ActiveRecordBase<DbAccount> 
{ 
    // this is the ORM entity 
} 

public class Account 
{ 
    // this is the primary full valued Dto 
} 

public class LazyAccount : Account 
{ 
    // this class as it is named doesn't load the majority of the properties of account 
} 

Mapper.CreateMap<DbAccount,Account>(); 
//There are lots of custom mappings, but I don't believe they are relevant 

Mapper.CreateMap<DbAccount,LazyAccount>(); 
//All non matched properties are ignored 

それはまた、私はこの時点でAutoMapperでこれらをマッピングしていないものの、これらのオブジェクトが含まれます。

public class DbParty : ActiveRecordBase<DbParty> 
{ 
    public IList<DbPartyAccountRole> PartyAccountRoles { get; set; } 
    public IList<DbAccount> Accounts {get; set;} 
} 

public class DbPartyAccountRole : ActiveRecordBase<DbPartyAccountRole> 
{ 
    public DbParty Party { get; set; } 
    public DbAccount Account { get; set; } 
} 

これらのクラスは、次を含むカスタムコードを使用して変換されます。sourceはDbPartyです。

var party = new Party() 
//field to field mapping here 

foreach (var partyAccountRole in source.PartyAccountRoles) 
{ 
    var account = Mapper.Map<LazyAccount>(partyAccountRole.Account); 
    account.Party = party; 
    party.Accounts.Add(account); 
} 

私が問題を抱えているテストでは、新しいDbPartyと、新しいDbPartyにリンクされた2つの新しいDbAccountと、新しいDbPartyにリンクされた2つの新しいDbPartyAccountRolesと、各DbAccountにそれぞれ1つずつ作成されます。 その後、DbPartyリポジトリを介していくつかの更新機能をテストします。必要に応じてこれを行うためにいくつかのコードを含めることができますが、それはちょうどスクラブに時間がかかるでしょう。

単独で実行すると、このテストはうまく動作しますが、別のテスト(私は以下に詳細すること)と同じセッションで実行したときに上記の変換コードでマッパーの呼び出しは、この例外がスローされます。

System.InvalidCastException : Unable to cast object of type '[Namespace].Account' to type '[Namespace].LazyAccount'. 

もう1つのテストでは、新しいDbPartyが作成されますが、1つのDbAccountのみが作成され、3つのDbPartyAccountRolesが作成されます。この行をコメントアウト

Assert.That(DbPartyAccountRole.FindAll().Count(), Is.EqualTo(3)) 

は、他のテストに合格することができます:私は、他のテストを破壊し、それが正確なラインまで、このテストを絞り込むことができました。

私の推測では、AutoMapperを呼び出すときにDbAccountオブジェクトの背後にあるCastleProxyと何か関係があるためにテストが中断していると思われますが、私はちょっと考え方がありません。

私は今、関連する機能テスト(サービス自体を呼び出す)を実行することができました。彼らはうまく動作しているように見えますが、これは単体テストの設定が重要な要素になると思います。質問はメモリデータベース内のSqlLiteに対して実行されます。

+0

私は問題を作り出している正確なテストを見つける過程にあります。 – Phaeze

+0

私は正確なテストとそのテスト内の正確な行を見つけました。私はそれをクリーンアップするために質問を書き直して、より多くのコンテキストを追加しました – Phaeze

答えて

0

問題は、ユニットテストでAutoMapper Bootstrapperを複数回実行することに関連していました。呼び出しはテストベースクラスのTestFixtureSetupメソッドにありました。修正プログラムは、マップを作成する前に次の行を追加することでした

Mapper.Reset(); 

私はこの問題を持っていた地図のみだった理由としてはまだ興味があります。

関連する問題