2017-02-17 79 views
0
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依賴的方法。 以下是測試方法的代碼。IMapable映射的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(); 

我找回正確的計數,但對象都是空。我嘗試使用返回,但它只返回一個對象。 是否可以退貨?

+0

我建議你使用真正的Automapper類,因爲它在UT中的工作和在代碼中一樣。畢竟,你沒有測試它,你正在測試你的代碼,它檢查是否正確調用了'.Map <>'。 – zaitsman

回答

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擴展方法被用於向上計數的。

我瞭解到,經過無數小時試圖找出爲什麼我的測試失敗後的艱難之路。

1

不要模擬IQueryable。不要模擬IMapper。不要模擬DbContext。這是一個提供零值的單元測試,在封面下面有很多事情要做。爲這些或我所做的工作提供一個門面,只需編寫一個使用真實事物的集成測試。這可以提供價值。