测试方法'X'引发异常:System.InvalidOperationException:Mapper未初始化.使用适当的配置调用Initialize

ran*_*ous 5 c# asp.net-mvc unit-testing automapper

这是我正在开发单元测试的方法的代码:

public ActionResult ItemsListing()
{
    var itemsList = itemsRepository.GetItems(true);

    if (itemsList.Count() > 0)
    {
        var itemsListVMs = Mapper.Map<IEnumerable<Item>, IEnumerable<itemsListingViewModel>>(itemsList);
        return View(itemsListVMs);
    }
    else
    {
        return RedirectToAction("Home");
    }

}
Run Code Online (Sandbox Code Playgroud)

以下是映射配置文件中的代码:

public static class MappingConfig
{
    public static void RegisterMaps()
    {
        Mapper.Initialize(config =>
        {
            config.CreateMap<Item, itemsListingViewModel>();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

而我在初始化映射Application_Start()的事件Global.asax如下:

MappingConfig.RegisterMaps();
Run Code Online (Sandbox Code Playgroud)

下面是我正在尝试运行的简单测试方法:

[TestMethod]
public void ItemsListing()
{
    HomeController controller = new HomeController();

    ViewResult result = controller.ItemsListing() as ViewResult;

    Assert.IsNotNull(result);
}
Run Code Online (Sandbox Code Playgroud)

我只是运行应用程序时工作正常.但是当我尝试运行单元测试方法时,它会显示上面提到的错误消息.任何人都可以帮我解决这个问题吗?谢谢!

Nko*_*osi 6

您需要创建/注册单元测试的映射以及Application_Start()未执行的映射.它与IIS相关联,在单元测试期间未运行.您必须手动调用映射配置.

[TestClass]
public class HomeControllerTests {
    [ClassInitialize]
    public static void Init(TestContext context) {
        MappingConfig.RegisterMaps();
    }

    [TestMethod]
    public void ItemsListing() {
        HomeController controller = new HomeController();

        ViewResult result = controller.ItemsListing() as ViewResult;

        Assert.IsNotNull(result);
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的测试中,映射配置是在用[ClassInitialize]属性装饰的方法中完成的

ClassInitializeAttribute类 标识一种方法,该方法包含在测试类中的任何测试运行之前必须使用的代码,并分配测试类要使用的资源.

  • 您可能想详细介绍一下[TestInitialize]。重要的是要知道它将导致该代码块在该类中的每个测试之前运行一次。 (2认同)