2013-04-22 31 views
7

Sto passando il mouse sui miei AutoMapper dall'utilizzo di una classe di AutoMapperConfiguration di grandi dimensioni all'utilizzo dei profili effettivi. Globale ora sembra così (perdonate l'apertura/chiusura di violazione per ora)Profili AutoMapper e test unitario

Mapper.Initialize(x => 
         { 
          x.AddProfile<ABCMappingProfile>(); 
          x.AddProfile<XYZMappingProfile>(); 
          // etc., etc. 
        }); 

Il pezzo chiave che mi ha fatto sopra le righe e l'ostacolo che aveva precedentemente mi ha sempre fatto desistere dall'utilizzare profili era vincolante la mia Ninject. Non potrei mai ottenere che l'associazione funzioni. Prima ho avuto questa vincolante:

Bind<IMappingEngine>().ToConstant(Mapper.Engine).InSingletonScope(); 

allora ho migrato a questo legame:

Bind<IMappingEngine>().ToMethod(context => Mapper.Engine); 

Questo funziona ora, l'applicazione è funzionale, non ho un profilo, e le cose sono buone.

L'intoppo è ora nei miei test di unità. Usando NUnit, installerei le mie dipendenze del costruttore.

private readonly IMappingEngine _mappingEngine = Mapper.Engine; 

e poi nel mio metodo [Impostazioni] mi piacerebbe costruire il mio controller MVC e chiamare la classe AutoMapperConfiguration.

[SetUp] 
public void Setup() 
{ 
    _apiController = new ApiController(_mappingEngine); 
    AutoMapperConfiguration.Configure(); 
} 

che ora ho modificato per.

[SetUp] 
public void Setup() 
{ 
    _apiController = new ApiController(_mappingEngine); 

    Mapper.Initialize(x => 
          { 
           x.AddProfile<ABCMappingProfile>(); 
           x.AddProfile<XYZMappingProfile>(); 
           // etc., etc. 
          }); 
} 

Sfortunatamente, questo non sembra funzionare. Le mappature non sembrano essere rilevate come quando colpisco un metodo che utilizza i mapping, AutoMapper genera un'eccezione che indica che la mappatura non esiste. Qualche suggerimento su come/cosa modificare la definizione/iniezione del mapper nel test per risolvere questo problema? Immagino che la definizione del campo IMappingEngine sia il mio problema, ma non sono sicuro delle opzioni che ho.

Grazie

risposta

3

problema che hai è risultato dell'utilizzo di statica Mapper.Engine che è una sorta di Singleton che contiene la configurazione per automapper. Per convenzione, Mapper.Engine non deve essere modificato dopo la configurazione. Quindi, se desideri configurare Automapper fornendo AutoMapper.Profiler per ciascuna delle unittest, dovresti evitare di usarlo.

I cambiamenti sono abbastanza semplici: aggiungere alla istanza la classe AutoMapperConfiguration di essa la propria istanza AutoMapper.MappingEngine invece di utilizzare statica Mapper.Engine globale.

public class AutoMapperConfiguration 
{ 
    private volatile bool _isMappinginitialized; 
    // now AutoMapperConfiguration contains its own engine instance 
    private MappingEngine _mappingEngine; 

    private void Configure() 
    { 
     var configStore = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()); 

     configStore.AddProfile(new ABCMappingProfile()); 
     configStore.AddProfile(new XYZMappingProfile()); 

     _mappingEngine = new MappingEngine(configStore); 

     _isMappinginitialized = true; 
    } 

    /* other methods */ 
} 

ps: full sample is here

+0

Mi dispiace non hanno ottenuto di nuovo a voi ancora. Ho eseguito un test e il tuo Git funziona, ma non appena provo a estrarre il motore come parametro di costruzione, le cose vanno fuori dai binari. Cercherò di tornare in giro stasera per ulteriori test. – Khepri

+0

Ho verificato stamattina che come soluzione standalone, il tuo git fa quello che ti aspetteresti. Tuttavia, per il mio scenario in cui sto provando a passare un'istanza di IMappingEngine come parametro costruttore che utilizza Ninject, non riesco ancora a ricevere i mapping inizializzati. Ho preso il git e ho aggiunto un metodo per restituire il MappingEngine inizializzato e ho tentato di passarlo come parametro del costruttore. I risultati erano gli stessi. – Khepri

+0

Hai provato a sostituire _all_ calls/refences a 'Mapper' (' Mapper.Initialize', 'Mapper.Engine', ecc.) Con la nuova istanza autonoma di' MappingEngine'? – Akim