映射器未初始化,我的单元测试Core.Net 2.0错误 [英] Mapper not initialized , error with my unit test Core.Net 2.0

查看:142
本文介绍了映射器未初始化,我的单元测试Core.Net 2.0错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Core.net 2.0中使用UOW和automapper完成了一个WebApi。
一切工作正常,但现在我想用Nunit实施单元测试,并且出现自动映射器错误

I have a WebApi done in Core.net 2.0, with UOW , and automapper. Everything is working fine, but now I want to implement Unit Test with Nunit, and I have this error of automapper


Message :System.InvalidOperationException:映射器未初始化。
调用使用适当的配置进行初始化。如果您试图
通过容器或其他方式使用mapper实例,请确保您
没有对静态Mapper.Map方法的任何调用,并且如果您使用ProjectTo或
UseAsDataSource扩展方法,请确保您
通过了适当的IConfigurationProvider实例。

Message: System.InvalidOperationException : Mapper not initialized. Call Initialize with appropriate configuration. If you are trying to use mapper instances through a container or otherwise, make sure you do not have any calls to the static Mapper.Map methods, and if you're using ProjectTo or UseAsDataSource extension methods, make sure you pass in the appropriate IConfigurationProvider instance.

如何解决此问题。提前致谢 。
Jolynice

How can I solve this. Thanks in advance . Jolynice

Class AutoMapperProfile.cs

Class AutoMapperProfile.cs

public class AutoMapperProfile : Profile
{
    public AutoMapperProfile()
    {
        CreateMap<Cars, CarsDTO>()
            .ReverseMap();
    }
}

Class Startup.cs

class Startup.cs

public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    public void ConfigureServices(IServiceCollection services)
    {

        //removed configurations 

        // Add cors
        services.AddCors();

        // Add framework services.
        services.AddMvc();

        Mapper.Initialize(cfg =>
        {
            cfg.AddProfile<AutoMapperProfile>();
        });

        // Repositories
        services.AddScoped<IUnitOfWork, HttpUnitOfWork>();
        services.AddScoped<IAccountManager, AccountManager>();
    }
}

class carsController.cs

class carsController.cs

[Authorize]
[Route("api/[controller]")]
public class CarsController : Controller
{
private IUnitOfWork _unitOfWork;
readonly ILogger _logger;
private readonly IAccountManager _accountManager;

public CarsController(
    IUnitOfWork unitOfWork,
    ILogger<CarsController> logger, 
    IAccountManager accountManager)
{
    _unitOfWork = unitOfWork;
    _logger = logger;
    _accountManager = accountManager;
}


[HttpGet]
public IActionResult GetAll()
{
    var allCars = _unitOfWork.CarsRepository.GetAllCarsData();
    if (allCars == null)
    {
        return NotFound();
    }
    return Ok(Mapper.Map<IEnumerable<CarsDTO>>(allCars));
}

这是我的单元测试

[TestFixture]
public class CarsControllerTest
{
#region private variables
List<Cars> cars = new List<Cars>();

CarsController _carsController = null;
IUnitOfWork _unitOfWork;
ICarsRepository _carsRepository;
#endregion


[SetUp]
public void SetUp()
{
    cars = new List<Cars>
    {
     new Cars
    {
        Alias = "406Moq",
        BrandId = 1,
        ModelId = 1,
        Plate = "00-00-01",
        AltranVehicle = 0,
        DefaultCar = 0,
        Active = 1,
        ColorId = 1
    }
    };
}


[Test]
public void GetAllCarsControllerTest()
{
    //Arrange
    _carsRepository = SetupCarsRepository();
    var unityOfWork = new Mock<IUnitOfWork>();
    var _logger = new Mock<ILogger<CarsController>>();
    var accountManager = new Mock<IAccountManager>();

    unityOfWork.SetupGet(c => c.CarsRepository).Returns(_carsRepository);
    _unitOfWork = unityOfWork.Object;

    _carsController = new CarsController(_unitOfWork, _logger.Object, accountManager.Object);


    //Act
    var carsResult = _carsController.GetAll();

    //Assert
    carsResult.StatusCode.Should().Be(HttpStatusCode.OK);
}

private ICarsRepository SetupCarsRepository()
{
    //initialize  repository
    var mockRepo = new Mock<ICarsRepository>(MockBehavior.Default);

    //Setup mocking behavior
    mockRepo.Setup(c => c.GetAllCarsData()).Returns(cars);

    return mockRepo.Object;
}

//Cleanup
[TearDown]
public void TearDown()
{
    cars = null;
}
}
}


推荐答案

您在单元测试中缺少映射器的初始化。下面的代码在 CarsControllerTest 类构造函数中初始化映射器。

You are missing initialization of your mapper in your unit test. The following initializes the mapper in the CarsControllerTest class constructor.

[TestFixture]
public class CarsControllerTest
{
    public CarsControllerTest()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.AddProfile<AutoMapperProfile>();
        });
    }
}

这篇关于映射器未初始化,我的单元测试Core.Net 2.0错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆