2016-08-11 7 views
2

クラスFooをAutoMapperを使ってクラスBarにマッピングしています。 BarはFooのViewModelです。 Barにはプロパティは少なくなりますが、Fooには存在しないプロパティのうちの1つにBarがカスタム検証属性を持つ以外は、対応するFooプロパティと完全に一致するすべてのプロパティがあります。AutoMapperを使用しているときにカスタム検証属性をスキップする方法はありますか?

public class Foo 
{ 
    string Prop1 { get; set; } 
    string Prop2 { get; set; } 
    string Prop3 { get; set; } 
    string Prop4 { get; set; } 
    string Prop5 { get; set; } 
} 

public class Bar 
{ 
    string Prop1 { get; set; } 
    string Prop2 { get; set; } 

    [CustomValidation]  
    string Prop3 { get; set; } 
} 

は私がバーにはFooをマッピングするためにAutoMapperを使用したいが、私はは、マッピングが発生した場合、「CustomValidation」属性は実行されないようにします。

これはProp3が具体的に無視されて...それはまだCustomValidation属性を発射...私のマッピングコードがどのように見えるかさえMemberList.Noneがに渡されると

  Mapper.Initialize(cfg => cfg.CreateMap<Foo, Bar>(MemberList.None) 
      .ForMember("Prop3", m => m.Ignore())); 

です。

これをやめないようにするにはどうすればよいですか?

または代わりに...

は、私は、デフォルト以外のコンストラクタでCustomValidation属性を発射することはできますか?

文脈でこのむしろ奇妙な質問をする。私はこのマッピングを実行するControllerメソッドを単体テストしようとしています。 CustomValidation属性がデータベースにヒットし、単体テストを高速化することを避けたいと思います。私は、CustomValidation属性をコンストラクタ内のIoCコンテナを受け入れるように設定しています。これにより、疑似命令を渡してデータベースを回避することができます。これは、検証を完全に回避するための完全に良い代替ソリューションになります。

答えて

0

自動マッパーは検証属性を気にしません。

テストで実際の検証が実行されないようにするには、データベースに格納されたサービスやリポジトリを抽象化して、テストでモックまたはスタブすることが有効な方法だと思います。

私は本当にオートマッパーはあなたの問題ではないと思います。

+0

カスタム検証属性は、IoCコンテナをコンストラクタパラメータとして既に受け付けているため、モックリポジトリでユニットテストを行うことができます。それは単体でカスタム検証属性を単体テストするときにうまく動作します。 問題は、自分自身がモデルからViewModelへのAutoMapperマッピングを実行し、ViewModelにカスタム検証属性が含まれているコントローラメソッドをユニットテストしようとしていることです。 IoCコンテナをコントローラに渡すことも、カスタム属性に別々に渡すこともできますが、AutoMapper経由でコントローラからアトリビュートには見えません。 – spoonraker

+1

今私は理解しています。しかし、われわれが明らかにしたように、あなたはモデルの価値を設定するための検証について話している。有効です、そうですか?はいの場合、どのようにスタブしていますか?そのコードを貼り付けることは私があなたを助けるのに役立ちます。 –

+0

* ModelState.IsValid –

関連する問題