2016-07-25 12 views
0

MVCアプリケーションで以下のコントローラコードを単体テストしようとしています。AutoMapperを使用するユニットテストコントローラ

[AllowAnonymous] 
    public ActionResult Index(string sort) 
    { 
     IEnumerable<Artist> artists; 
     if (Request.IsAuthenticated) 
     { 
     artists = _artistService.GetArtistsForUser(User.Identity.GetUserId()); 
     if (!string.IsNullOrEmpty(sort) && sort != "asc") 
     { 
      ViewBag.Sort = "desc"; 
      artists = artists.OrderByDescending(a => a.FName); 
     } 
     } 
     else 
     { 
     artists = _artistService.GetArtists(false); 
     if (!string.IsNullOrEmpty(sort) && sort != "asc") 
     { 
      ViewBag.Sort = "desc"; 
      artists = artists.OrderByDescending(a => a.FName); 
     } 
     } 

     var vm = new ArtistIndexVM { Artists = Mapper.Map<IEnumerable<Artist>, IEnumerable<ArtistVM>>(artists) }; 
     return View(vm); 
    } 

最後のreturn文の直前に、私はAutoMapperマッピングがあります。私はユニットテストを実行しようとすると、これはエラーを投げています。 AutoMapper.AutoMapperMappingException:欠落型マップ設定またはサポートされていないマッピングエラーが

試験方法Project.Controllers.ArtistControllerTests.Index_Get_ReturnsAViewResultは例外をスローします。

これを解決するには、テストプロジェクトで再度マッピングを再定義する必要はありません。ご存じのように、自分のことを繰り返さない(DRY)の原則に沿って。

+0

マッピングの設定は、実行前にユニットテストコードで呼び出すことができるように、外部呼び出し元からアクセス可能にする必要があります。 – Nkosi

+0

それで、マッピングを自分のプロジェクトの中に置くのが最善だと言いますか?この方法で、マッピング設定が必要なときにはいつでもそのプロジェクトを参照できます。私がそれをしたら、私はテストをパスするために何か他のことをする必要がありますか? – Ciwan

+0

いいえ、彼ら自身のプロジェクトは必要ありません。 MVC5を使用していると仮定すると、そこに直接構成を処理するStartupクラスがあることが前提となります。単体テスト時にこの起動は呼び出されていません。おそらく、起動時にすべてを設定する必要はありません。だから私は、AutoMapperの設定を単体テストから呼び出せるものに分離することを提案していました。 – Nkosi

答えて

0

ユニットテストの前にMapper.Initialize初期化を呼び出すようにしてください。あなたは、あなたのアプリの起動時にMapper.Initialize、通常はMVCアプリケーション用のApp_Startを呼び出す必要があります。

Mapper.Initializeを一度呼び出すだけでよく、一般的なアプローチは起動時の静的コンストラクタに置くことです。

関連する問題