xUnit测试和.NET Core 2.0中的Automapper

巴拉特

我有.NET Core 2.0项目,其中包含存储库模式和xUnit测试。

现在,这里是其中的一些代码。

控制器:

public class SchedulesController : Controller
{
    private readonly IScheduleRepository repository;
    private readonly IMapper mapper;

    public SchedulesController(IScheduleRepository repository, IMapper mapper)
    {
        this.repository = repository;
        this.mapper = mapper;
    }

    [HttpGet]
    public IActionResult Get()
    {
        var result = mapper.Map<IEnumerable<Schedule>, IEnumerable<ScheduleDto>>(source: repository.items);
        return new OkObjectResult(result);
    }
}

我的测试班:

public class SchedulesControllerTests
{
    [Fact]
    public void CanGet()
    {
        try
        {
            //Arrange
            Mock<IScheduleRepository> mockRepo = new Mock<IScheduleRepository>();
            mockRepo.Setup(m => m.items).Returns(new Schedule[]
            {
                new Schedule() { Id=1, Title = "Schedule1" },
                new Schedule() { Id=2, Title = "Schedule2" },
                new Schedule() { Id=3, Title = "Schedule3" }
            });

            var mockMapper = new Mock<IMapper>();
            mockMapper.Setup(x => x.Map<Schedule>(It.IsAny<ScheduleDto>()))
                .Returns((ScheduleDto source) => new Schedule() { Title = source.Title });

            SchedulesController controller = new SchedulesController(repository: mockRepo.Object, mapper: mockMapper.Object);

            //Act
            var result = controller.Get();

            //Assert
            var okResult = result as OkObjectResult;
            Assert.NotNull(okResult);

            var model = okResult.Value as IEnumerable<ScheduleDto>;
            Assert.NotNull(model);

        }
        catch (Exception ex)
        {
            //Assert
            Assert.False(false, ex.Message);
        }
    }
}

我面临的问题。

我的问题是,当我使用数据库上下文和executeGet()方法运行此代码时,它可以很好地工作,它可以提供所有结果。

但是,当我尝试运行测试用例时,它没有返回Dto对象的任何数据。当我调试时,我发现

  1. 我正在使用来在控制器中获取测试对象mockRepo

  2. 但是看起来自动映射器未正确初始化,因为在映射时它没有返回任何内容

    var result = mapper.Map<IEnumerable<Schedule>, IEnumerable<ScheduleDto>>(source: repository.items);

到目前为止我尝试了什么?

我遵循了所有这些答案,但仍然无法正常工作。

在单元测试中模拟Mapper.Map()

如何使用AutoMapper模拟列表转换

因此,我需要精通xUnit和自动映射器的人的帮助,并且需要有关如何正确初始化模拟Mapper的指导。

巴拉特

最终它对我有用,我遵循了这种方式如何为使用AutoMapper和依赖注入的.net core 2.0服务编写xUnit测试?

我在这里发布我的答案和测试类,以便在需要时可以使用其他SO。

public class SchedulesControllerTests
{
    [Fact]
    public void CanGet()
    {
        try
        {
            //Arrange
            //Repository
            Mock<IScheduleRepository> mockRepo = new Mock<IScheduleRepository>();
            var schedules = new List<Schedule>(){
                new Schedule() { Id=1, Title = "Schedule1" },
                new Schedule() { Id=2, Title = "Schedule2" },
                new Schedule() { Id=3, Title = "Schedule3" }
            };

            mockRepo.Setup(m => m.items).Returns(value: schedules);

            //auto mapper configuration
            var mockMapper = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile(new AutoMapperProfile());
            });
            var mapper = mockMapper.CreateMapper();

            SchedulesController controller = new SchedulesController(repository: mockRepo.Object, mapper: mapper);

            //Act
            var result = controller.Get();

            //Assert
            var okResult = result as OkObjectResult;
            if (okResult != null)
                Assert.NotNull(okResult);

            var model = okResult.Value as IEnumerable<ScheduleDto>;
            if (model.Count() > 0)
            {
                Assert.NotNull(model);

                var expected = model?.FirstOrDefault().Title;
                var actual = schedules?.FirstOrDefault().Title;

                Assert.Equal(expected: expected, actual: actual);
            }
        }
        catch (Exception ex)
        {
            //Assert
            Assert.False(false, ex.Message);
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在.NET Core和Visual Studio Code中调试xUnit测试

如何为使用AutoMapper和依赖注入的.net core 2.0服务编写xUnit测试?

xUnit.net v2在Visual Studio 2015中找不到.NET Core测试

XUnit ASP.Net Core WebAPI 测试中EnsureSuccessStatusCode 和Assert.Equal(HttpStatusCode.OK, response.StatusCode) 的区别

在Asp.net Core中对IFormFile字段进行xunit测试

在.Net Core 1.1中不再发现的XUnit测试

VSTS中未发现.NET Core 2.0 xUnit测试

在Bamboo中显示Asp.Net.Core XUnit测试结果

为ASP.NET Core / EF Core / xUnit.NET集成测试中的每个测试种子测试数据

测试枚举和字符串-.NET Core 3.1和xUnit

.net Core 2.0 ConfigureLogging xunit测试

测试Logger的输出-xUnit .NET Core 3.1

使用xUnit测试.Net Core库

.NET CORE MVC ViewComponent xUnit测试

使用 XUnit 和 AspNetCore.TestHost 测试 .net core web api 控制器文件上传

在使用 xunit 和 .net core 3.1 进行单元测试时获取记录器

使用.NET Core和xUnit同时针对多个框架的单元测试代码

使用 xunit 和 moq 进行 net core api 控制器单元测试

如何将.NET Core 2.0 xUnit测试报告获取到VSTS中

如何在Teamcity中运行针对新.NET Core * .csproj的xUnit测试?

在Xunit集成测试中检索ASP.NET Core 3.1数据库上下文

AutoMapper:以Net Core 2语法双向映射

.NET Core 2.0和xUnit无法运行

用于.net核心2和DI的xUnit用于测试DAL-有点混乱

.NET Core 2中的StructureMap和Proto.Actor

ASP.NET Core 2+中的ILogger和DependencyInjection

使用 xUnit 和 Moq 在 .NET 5 中对 FluentEmail 进行单元测试

无法使xUnit测试与.NET Core一起运行

如何在 .NET Core 的 xUnit 测试中使用 NLog?