2014-11-18 7 views
0

프로그래밍에는 메모리 데이터를 사용하는 모의 테스트가 있습니다. 다음 코드에서 DBSet 추가가 실패하고 DBSet의 기존 고객 항목이 손상되는 이유는 무엇입니까?

 // Let us create some in-memory data 
     // Create a list of Customer 
     List<Customer> listOfCustomers = new List<BlahProjectBlahExample.Domain.Objects.Customer>() 
            { new Customer { CustomerID = "1 ", CompanyName = "Chicago Bulls", ContactName = "Michael Jordan", ContactTitle = "top basket ball player", Address = "332 testing lane", City = "Chicago", Region = "Illinois", PostalCode = "484894", Country = "USA", Phone = "3293993", Fax = "39393" }, 
            new Customer { CustomerID = "2 ", CompanyName = "Miami Heat", ContactName = "Lebron James", ContactTitle = "second best basket ball player", Address = "90 test street", City = "Miami", Region = "Florida", PostalCode = "4869394", Country = "USA", Phone = "3293213", Fax = "33393" }, 
            new Customer { CustomerID = "3 ", CompanyName = "Oklahoma City Thunder", ContactName = "Kevin Durant", ContactTitle = "current top basket ball player", Address = "35 test row", City = "Oklahoma City", Region = "Oklahoma", PostalCode = "480290", Country = "USA", Phone = "304923", Fax = "33325" } 
            }; 
     // Convert the list to an IQueryable list 
     IQueryable<Customer> queryableListOfCustomerInMemoryData = listOfCustomers.AsQueryable(); 


     // Let us create a Mocked DbSet object. 
     Mock<DbSet<BlahProjectBlahExample.Domain.Objects.Customer>> mockDbSet = new Mock<DbSet<BlahProjectBlahExample.Domain.Objects.Customer>>(); 

    // Force DbSet to return the IQueryable members 
     // of our converted list object as its 
     // data source 
     mockDbSet.As<IQueryable<BlahProjectBlahExample.Domain.Objects.Customer>>().Setup(m => m.Provider).Returns(queryableListOfCustomerInMemoryData.Provider); 
     mockDbSet.As<IQueryable<BlahProjectBlahExample.Domain.Objects.Customer>>().Setup(m => m.Expression).Returns(queryableListOfCustomerInMemoryData.Expression); 
     mockDbSet.As<IQueryable<BlahProjectBlahExample.Domain.Objects.Customer>>().Setup(m => m.ElementType).Returns(queryableListOfCustomerInMemoryData.ElementType); 
     mockDbSet.As<IQueryable<BlahProjectBlahExample.Domain.Objects.Customer>>().Setup(m => m.GetEnumerator()).Returns(queryableListOfCustomerInMemoryData.GetEnumerator()); 



     Mock<BlahProjectBlahDataContext> mockedReptryCtxt = new Mock<BlahProjectBlahDataContext>(); 


     mockedReptryCtxt.Setup(q => q.Customers).Returns(mockDbSet.Object); 
     mockedReptryCtxt.Setup(q => q.Set<Customer>()).Returns(mockDbSet.Object); 
     mockedReptryCtxt.CallBase = true; 




     DbSet<Customer> inMemoryDbSetCustomer = mockedReptryCtxt.Object.Set<Customer>(); 

, 나는 inMemoryDbSetCustomer의 내용을 확인하기 위해 루프를 사용하고, 그것은 예상 데이터가 포함되어 있습니다.

슬프게도
 Customer something; 
     foreach (var entry in inMemoryDbSetCustomer) 
     { 
      something = entry as Customer; 
     } 

, 나는 새로운 고객을 추가하려고, 1) inMemoryDbSetCustomer는 고객 2) inMemoryDbSetCustomer.Add (someCust)을 inMemoryDbSetCustomer 모두 잃은 것 같습니다) NULL 3을 반환을 추가 실패 다른 고객 항목입니다.

 Customer someCust = new Customer { CustomerID = "4 ", CompanyName = "Kolkota Knights", ContactName = "Sachin Tendulkar", ContactTitle = "current top cricket player", Address = "35 test row", City = "Kolkota", Region = "West Bengal", PostalCode = "3454534", Country = "India", Phone = "304923", Fax = "33325" }; 
     try 
     { 
      Customer returnCust = (Customer)(inMemoryDbSetCustomer.Add(someCust)); 
     } 
     catch(Exception ex){ 

     } 

왜 DBSet 추가가 실패하고 DBSet의 기존 고객 항목도 손상됩니까? @Werlang 제안에 대답

업데이트

감사합니다. 다음 코드 추가 도움 :

What steps to get rid of Collection was modified; enumeration operation may not execute. Error?

답변

0

: 다음 나는 당신처럼 MOQ 프레임 워크 DBSets을 조롱하는 경우 유사한 문제에 직면 할 수 있기 때문에

mockDbSet.Setup(m => m.Add(It.IsAny<Customer>())) 
        .Callback<Customer>((Customer c) => { listOfCustomers.Add(c); }) 
        .Returns((Customer c) => c); 

또한, 다음과 같은 유래 게시물이 도움이 될 것입니다 IQueryable을 통해 액세스 할 때 고정 된 데이터 집합을 반환하도록 쿼리 가능 함수를 조롱했습니다. 그러나 Add는 DbContent 내부의 분리 된 목록에서 DbEntry의 형태로 유지됩니다.

Add() 메소드도 조롱하고 조롱 된 배열 (listOfCustomers)에 새 요소를 추가하는 것이 좋습니다.