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.
Sono in procinto di trovare il test esatto che sta creando il problema. – Phaeze
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