Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AutoMapper+xUnit: Missing type map configuration or unsupported mapping

I cannot figure this one out. I have a N-Tier ASP.MVC application and I am writing my first Unit Test and it seems to fail on my AutoMapper configuration. I have used AutoMapper a million times and never had any problems using it.

I'm sure I am missing something simple, but I have been staring at this for 24 hours now.

Class Library: APP.DOMAIN

public class User : IEntity<int>
{
    public int Id { get; set; }

    [StringLength(20), Required]
    public string UserName { get; set; }
}

Class Library: APP.SERVICE

References App.Domain

public class UserViewModel
{
    public int Id { get; set; }
    public string UserName { get; set; } 
}

I have my AutoMapper bootstrapper in the service layer.

public static class AutoMapperBootstrapper
{
    public static void RegisterMappings()
    {
        Mapper.CreateMap<User, UserViewModel>();
    }
}

UserService.cs

 public class UserService : IUserService
 {
    private readonly IUserRepository _userRepository;

    public UserService(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public List<UserViewModel> GetUsers()
    {
        var users = _userRepository.GetAll();

        if (users == null)
        {
            throw new Exception("No users found.");
        }

        return Mapper.Map<List<UserViewModel>>(users); // FAILS ON AUTOMAPPER
    }
  }

ASP.MVC Layer: APP.WEB

References App.Service

private void Application_Start(object sender, EventArgs e)
{
    // Register AutoMapper
    AutoMapperBootstrapper.RegisterMappings();
    Mapper.AssertConfigurationIsValid();

    // Code that runs on application startup
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}

Unit Test Layer:

public class TestUserRepository :IUserRepository
{
    public IEnumerable<User> GetAll()
    {
        var users = new List<User>()
        {
            new User { Id = 1, UserName = "Mary"},
            new User { Id = 2, UserName = "Joe"}
        };
        return users;
    }
  }


public class UserServiceTest
{
    private IUserService _userService;
    private readonly IUserRepository _userRepository;

    public UserServiceTest()
    {
        _userRepository = new TestUserRepository();
    }

    [Fact]
    public void GetUsers_Should_Return_Correct_Number_Of_Users()
    {
        // Arrange
        _userService = new UserService(_userRepository);

        // Act
        var result = _userService.GetUsers(); // FAILS ON AUTOMAPPER

        // Assert
        Assert.True(result.Any(u => u.UserName == "Mary")); 
    }
}

Failing Test Message:

*** Failures ***

Exception
AutoMapper.AutoMapperMappingException: AutoMapper.AutoMapperMappingException : Missing type map configuration or unsupported mapping.

Mapping types:
User -> UserViewModel
App.Data.Model.User -> App.Service.ViewModels.UserViewModel

Destination path:
List`1[0]

Source value:
App.Data.Model.User
   at App.Service.Services.UserService.GetUsers() in D:\Repositories\App\App.Service\Services\UserService.cs:line 36
   at App.Tests.Service.Tests.UserServiceTest.GetUsers_Should_Return_Correct_Number_Of_Users() in D:\Repositories\App\App.Tests\Service.Tests\UserServiceTest.cs:line 34
like image 775
Fred Fickleberry III Avatar asked Sep 03 '14 15:09

Fred Fickleberry III


People also ask

How do I use AutoMapper to list a map?

Once you have your types, and a reference to AutoMapper, you can create a map for the two types. Mapper. CreateMap<Order, OrderDto>(); The type on the left is the source type, and the type on the right is the destination type.

How does AutoMapper work in C#?

AutoMapper in C# is a library used to map data from one object to another. It acts as a mapper between two objects and transforms one object type into another. It converts the input object of one type to the output object of another type until the latter type follows or maintains the conventions of AutoMapper.

What is AutoMapper in .NET core?

What is AutoMapper? AutoMapper is a simple library that helps us to transform one object type into another. It is a convention-based object-to-object mapper that requires very little configuration. The object-to-object mapping works by transforming an input object of one type into an output object of a different type.


1 Answers

A little late to the party but have you tried setting the mapping before running the test?

public class UserServiceTest
{    
    public UserServiceTest() 
    {
        // register the mappings before running the test
        AutoMapperBootstrapper.RegisterMappings();
    }

    ...
}
like image 116
sf. Avatar answered Sep 23 '22 19:09

sf.