user1990 user1990 - 1 year ago 419
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 Source

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.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download