使用AutoMapper的单元测试控制器

时间:2016-07-25 12:46:45

标签: unit-testing asp.net-mvc-5 automapper

我正在尝试在我的MVC应用程序中对以下控制器代码进行单元测试。

    [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);
    }

请注意,在最终返回语句之前,我有一个AutoMapper映射。当我尝试运行单元测试时,这会引发错误。错误是

  

测试方法Project.Controllers.ArtistControllerTests.Index_Get_ReturnsAViewResult抛出异常:   AutoMapper.AutoMapperMappingException:缺少类型映射配置或不支持的映射。

解决此问题的最佳方法是什么,而无需在测试项目中再次重新定义映射?你知道,这与Don不重复自己(DRY)原则一致。

1 个答案:

答案 0 :(得分:0)

确保在单元测试之前调用Mapper.Initialize初始化。您应该在应用程序的启动时调用Mapper.Initialize,通常是用于MVC应用程序的App_Start。

你只需要调用Mapper.Initialize一次,所以常见的方法是将它放在你的启动的静态构造函数中。