2015-09-09 12 views
6

Sto lavorando per implementare AutoMapper nel nostro servizio e sto riscontrando un problema molto confuso nei nostri test delle unità.Come arrestare Automapper dal mapping alla classe genitore quando è stata richiesta la classe figlio

Innanzitutto questo problema comporta i seguenti oggetti e le rispettive mappe:

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 

coinvolge anche questi oggetti, anche se non ho mappato questi con Automapper a questo punto:

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; } 
} 

Queste classi vengono convertite utilizzando il codice personalizzato che include quanto segue, dove source è un 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); 
} 

Il test con cui sto riscontrando un problema crea un nuovo DbParty, 2 nuovi DbAccount collegati al nuovo DbParty e 2 nuovi DbPartyAccountRoles entrambi collegati al nuovo DbParty e 1 ciascuno a ciascuno degli account DbAccounts. Quindi verifica alcune funzionalità di aggiornamento tramite il repository DbParty. Posso includere del codice per questo, se necessario, ci vorrà solo un po 'di tempo per scrub.

Quando viene eseguito da solo questo test funziona bene, ma quando viene eseguito nella stessa sessione di un altro test (che io dettaglio più avanti) la chiamata Mapper nel codice di conversione di cui sopra genera questa eccezione:

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

L'altro test crea anche un nuovo DbParty ma con un solo DbAccount e quindi crea 3 DbPartyAccountRoles. Sono stato in grado di restringere questo test fino alla linea esatto che rompe l'altro test ed è:

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

Commentando questa linea permette l'altra prova da superare.

Con queste informazioni suppongo che il test si interrompa a causa di qualcosa che ha a che fare con il CastleProxy che si trova dietro l'oggetto DbAccount quando si chiama AutoMapper ma non ho la minima idea di come.

Ora sono riuscito a eseguire i test funzionali pertinenti (effettuare chiamate contro il servizio stesso) e sembrano funzionare bene, questo mi fa pensare che l'impostazione del test dell'unità potrebbe essere un fattore, il più notevole è che i test in la domanda viene eseguita su un database SqlLite nel database di memoria.

+0

Sono in procinto di trovare il test esatto che sta creando il problema. – Phaeze

+0

Ho trovato il test esatto, e anche la riga esatta all'interno di quel test e ho riscritto la domanda per pulirlo aggiungendo altro contesto – Phaeze

risposta

0

Il problema si è rivelato correlato all'esecuzione automatica di AutoMapper Bootstrapper più volte nei test delle unità; l'invocazione era nel metodo TestFixtureSetup sulla nostra classe base di test.

La correzione è stato quello di aggiungere la seguente riga prima di creare le mappe:

Mapper.Reset(); 

io sono ancora curioso di sapere il motivo per cui questa è stata l'unica mappa che ha avuto un problema.

Problemi correlati