user1990 user1990 - 3 months ago 120
C# Question

Test Method 'X' threw exception: System.InvalidOperationException: Mapper not initialized. Call Initialize with appropriate configuration

Here is the code for the method that I'm developing the unit test for:

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

}


Following is the code from the mapping configuration file:

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


And I have initialized mapper in the
Application_Start()
event of the
Global.asax
as below:

MappingConfig.RegisterMaps();


Below is the simple test method that I'm trying to run:

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

ViewResult result = controller.ItemsListing() as ViewResult;

Assert.IsNotNull(result);
}


It works fine when I simply run the application. But when I try to run the unit test method, it shows the mentioned error message. Can anyone help me to get over this issue? Thanks!

Answer

You need to create/register the mappings for your unit tests as well as the Application_Start() is not executed. It is associated with IIS, which is not running during unit tests. You have to manually call the mapping configurations.

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

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

        ViewResult result = controller.ItemsListing() as ViewResult;

        Assert.IsNotNull(result);
    }
}

In the above test the mapping configuration is done in a method decorated with [ClassInitialize] attribute which

ClassInitializeAttribute Class Identifies a method that contains code that must be used before any of the tests in the test class have run and to allocate resources to be used by the test class.