用于IQueryable映射的AutoMapper测试

时间:2017-02-17 21:06:11

标签: c# unit-testing automapper moq

public List<Models.Employer> GetEmployers()
{

    List<Models.Employer> empList = new List<Models.Employer>();
    var list = DataCentralDbContext.Employers.ToList();
    foreach (Data.Web.Employer e in list)
    {
        empList.Add(Mapper.Map<Data.Web.Employer, Models.Employer>(e));

    }
    return empList;
}

我想测试上面依赖于AutoMapper的方法。 以下是测试方法的代码。

var data = new List<Data.Web.Employer>
{
    new Data.Web.Employer {EmployerID= new Guid(), EmployerName = "BBB", AddressLine1="address 1", AddressLine2="address 2", City="City1",State="we",IsActive=true, PostalCode="12345" },
    new Data.Web.Employer {EmployerID= new Guid(), EmployerName = "ZZZ",AddressLine1="address 1", AddressLine2="address 2", City="City1",State="we",IsActive=true, PostalCode="12345"  },
    new Data.Web.Employer {EmployerID= new Guid(), EmployerName = "AAA",AddressLine1="address 1", AddressLine2="address 2", City="City1",State="we",IsActive=true, PostalCode="12345"  },
}.AsQueryable();

var mockSet = new Mock<DbSet<Data.Web.Employer>>();
mockSet.As<IQueryable<Data.Web.Employer>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Data.Web.Employer>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Data.Web.Employer>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Data.Web.Employer>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

var mockContext = new Mock<IDataCentralDbContext>();
mockContext.Setup(c => c.Employers).Returns(mockSet.Object);


var mapperMock = new Mock<IMapper>();
mapperMock.Setup(m => m.Map<CSF.Data.Web.Employer, CSF.Models.Employer>(It.IsAny<CSF.Data.Web.Employer>()));


var emplogic = new EmployerLogic(mockContext.Object, mapperMock.Object);

var result = emplogic.GetEmployers();

我确实得到了正确的Count但对象都是Null。我尝试使用Return,但它只返回一个对象。 是否可以退回收藏品?

2 个答案:

答案 0 :(得分:1)

不要嘲笑IQueryable。不要嘲笑IMapper。不要模拟DbContext。这是一个提供零价值的单元测试,有很多东西可以在封面下进行。为这些或我做的提供一个外观,只需编写一个使用真实内容的集成测试。这提供了价值。

答案 1 :(得分:0)

设置Returns以在测试中手动执行映射

mapperMock
    .Setup(m => m.Map<CSF.Data.Web.Employer, CSF.Models.Employer>(It.IsAny<CSF.Data.Web.Employer>()))
    .Returns((CSF.Data.Web.Employer e) => new CSF.Models.Employer { 
        EmployerID = e.EmployerID, 
        EmployerName = e.EmployerName,
        //....other code removed for brevity
    });

同样,在模拟枚举器时使用函数。

mockSet
    .As<IQueryable<Data.Web.Employer>>()
    .Setup(x => x.GetEnumerator()).Returns(() => data.GetEnumerator());

允许多个枚举仅传递.Returns(data.GetEnumerator())只允许一次通过枚举,而ToList扩展方法正在使用它。

我在无数个小时试图弄清楚为什么我的测试失败后才学到了很多困难。