2013-04-22 8 views
7

大きなAutoMapperConfigurationクラスを1つ使って実際のプロファイルを使用することから私のAutoMappersをロールオーバーしています。グローバルは現在、トップの上に私を得たと以前に常にプロファイルを使用してから私を停止していたハードルが結合私のninjectだったので(今のオープン/クローズの違反を許して)AutoMapperのプロファイルとユニットテスト

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

重要な部分のように見えます。私は結束を働かせることはできませんでした。このバインディングに

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

私は以来、移行した: 前、私はこのバインディングた

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

これが機能するようになりました、アプリが機能している、私は、プロファイルを持っている、と物事は良いです。

ヒットは私のユニットテストになりました。 NUnitを使って、コンストラクタの依存関係をセットアップします。

private readonly IMappingEngine _mappingEngine = Mapper.Engine; 

私の[設定]メソッドでは、MVCコントローラを作成してAutoMapperConfigurationクラスを呼び出します。

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

これまでに修正しました。

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

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

残念ながら、これはうまくいかないようです。マッピングは、マッピングを使用するメソッドにヒットしたときに取得されないように見えますが、マッピングが存在しないことを示す例外がAutoMapperによってスローされます。これを解決するためのテストでのマッパー定義/注入をどのように/どのように変更するかについての提案はありますか?私はIMappingEngineフィールドの定義は私の問題だと思っていますが、私が持っているオプションがわからない。あなたが持っている

おかげ

答えて

3

問題はAutoMapperための設定が含まれているシングルトンのいくつかの種類がある静的Mapper.Engineを使用した結果です。慣習的に、Mapper.Engineは、の設定後には変更しないでください。したがって、unittestのそれぞれにAutoMapper.Profilerを指定してAutomapperを設定したい場合は、それを使用しないでください。

変更は非常に簡単です:グローバルなスタティックMapper.Engineの代わりに、クラスAutoMapperConfigurationインスタンスを自分専用のインスタンスAutoMapper.MappingEngineに追加してください。

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

申し訳ありません。私はテストを実行し、あなたのGitは機能しますが、コンストラクタパラメータとしてエンジンを引き出すとすぐに、物事はレールから外れます。私は今夜​​、さらにテストするために回り回ります。 – Khepri

+0

私は今朝、スタンドアローンのソリューションとして、あなたの期待どおりのことをしていることを確認しました。しかし、私がNinjectを利用してコンストラクタパラメータとしてIMappingEngineのインスタンスを渡そうとしている私のシナリオでは、まだ初期化されたマッピングを受け取っていません。私はgitを取り出し、初期化されたMappingEngineを返すメソッドを追加し、それをコンストラクタparamとして渡そうとしました。結果は同じでした。 – Khepri

+0

_all_ calls/refencesを 'Mapper'(' Mapper.Initialize'、 'Mapper.Engine'など)に' MappingEngine'の新しいスタンドアロンインスタンスに置き換えようとしましたか? – Akim

関連する問題