2013-04-22 14 views
7

Ich fahre über meine AutoMapper von einer großen AutoMapperConfiguration-Klasse zur Verwendung von tatsächlichen Profilen. Globale sieht nun so (die Öffnen/Schließen Verletzung jetzt vergeben)AutoMapper-Profile und Unit Testing

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

Das Kernstück, die mich über die oben angelangt und die Hürde, die früher immer hatte hielt mich davon ab mit Profilen war mein ninject verbindlich. Ich könnte nie die Bindung zur Arbeit bekommen. Prior Ich hatte diese Bindung:

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

I dieser Bindung seit migriert haben:

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

Dies funktioniert nun die App funktioniert, habe ich Profile, und die Dinge sind gut.

Die Anhängevorrichtung ist jetzt in meinen Unit Tests. Mit NUnit würde ich meine Konstruktorabhängigkeiten einrichten.

private readonly IMappingEngine _mappingEngine = Mapper.Engine; 

und dann in meinem [Setup] Methode würde ich meine MVC-Controller und rufen Sie die AutoMapperConfiguration Klasse aufzubauen.

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

, die ich jetzt geändert habe.

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

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

Leider scheint dies nicht zu funktionieren. Die Zuordnungen scheinen nicht aufgenommen zu werden. Wenn ich eine Methode mit Zuordnungen ankreuze, löst AutoMapper eine Ausnahme aus, die besagt, dass die Zuordnung nicht existiert. Irgendwelche Vorschläge dazu, wie/was die Mapper-Definition/Injection im Test ändern soll, um das zu lösen? Ich vermute, die Definition des IMappingEngine-Feldes ist mein Problem, aber ich bin mir nicht sicher, welche Optionen ich habe.

Dank

Antwort

3

Problem, das Sie haben, ist durch statische Mapper.Engine verwendet, die eine Art von Singleton ist die Konfiguration für AutoMapper enthält. Per Konvention sollte Mapper.Engine nicht geändert werden, nachdem es konfiguriert wurde. Also, wenn Sie Automapper konfigurieren möchten, indem Sie AutoMapper.Profiler für jeden Unittest bereitstellen, sollten Sie es vermeiden.

Änderungen sind recht einfach: Fügen Sie Ihrer Instanz AutoMapperConfiguration ihre eigene Instanz AutoMapper.MappingEngine hinzu, anstatt globale statische Mapper.Engine zu verwenden.

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

Leider habe ich nicht zurück zu Ihnen noch bekommen. Ich habe einen Test gemacht und dein Git funktioniert, aber sobald ich versuche, den Motor als Konstruktorparameter herauszuziehen, gehen die Dinge von der Strecke. Ich werde heute Abend für weitere Tests umkreisen. – Khepri

+0

Ich habe heute Morgen verifiziert, dass Ihr Gitarist als eine eigenständige Lösung das tut, was Sie erwarten würden. Für mein Szenario, in dem ich versuche, eine Instanz von IMappingEngine als Konstruktorparameter mit Ninject zu übergeben, erhalte ich immer noch keine initialisierten Zuordnungen. Ich nahm den git und fügte eine Methode hinzu, um die initialisierte MappingEngine zurückzugeben und zu versuchen, diese als Konstruktorparameter zu übergeben. Die Ergebnisse waren die gleichen. – Khepri

+0

Haben Sie versucht, _all_ Aufrufe/Referenzen zu "Mapper" (Mapper.Initialize, Mapper.Engine, etc) durch neue eigenständige Instanz von MappingEngine zu ersetzen? – Akim