2017-02-17 10 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に依存する上記の方法をテストしたいと思います。 以下は、Test Methodのコードです。IQueryableマッピングの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です。私は返品を使用しようとしましたが、それは1つのオブジェクトを返します。 コレクションを返すことはできますか?列挙子は、関数を使用するからかったときに

+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をモックしないでください。それはゼロ価値を提供する単体テストであり、カバーの下には多くのことが起こります。これらのファサードを提供するか、私がしていることは、実際のものを使用する統合テストを書くだけです。それは価値を提供します。

関連する問題