Исключение во Временной создаваемой таблице в EF linq mocking - PullRequest
0 голосов
/ 12 сентября 2018

Я реализовал EF-тестирование с поддельным контекстом БД. Ниже мой sql запрос,

     flatLicenseOrderId = (from users in this.CustomerEntities.UserMappers
                                              where users.CompanyId == CompanyId && users.IsActive
                                              join order in this.CustomerEntities.Orders on users.customerid equals order.customerid into orderDetails
                                              from customerOrder in orderDetails.DefaultIfEmpty()
                                              join license in this.CustomerEntities.License on users.Customerid equals license.Customerid into licenseDetails
                                              from customerLicense in licenseDetails.DefaultIfEmpty()
                                              from orderdetails in this.CustomerEntities.OrderDetails
                                              where (customerOrder.OrderId == orderdetails.OrderId || customerLicense.OrderId == orderdetails.OrderId) 
                                              select orderdetails.OrderId).Distinct().ToList();

Ниже приведен мой насмешливый контекст,

     public static CustomerEntities GetOrderDetails()
            {
                var mockData = new Mock<CustomerEntities>();                

                var users = new FakeDbSet<UserMapper>
                {
                    new UserMapper { CompanyId = 27835, IsActive = true, CustomerId = 956980 },
                    new UserMapper { CompanyId = 148150, IsActive = true, CustomerId = 1039733 }
                };

                mockData.Setup(m => m.UserMappers).Returns(users);

                var order = new FakeDbSet<Orders>
                {
                    new Orders { CustomerId  = 956980, OrderId = 401789 },
                    new Orders { CustomerId = 956980, OrderId = 426192 }                   
                };

                mockData.Setup(m => m.Orders).Returns(order);    

                var license = new FakeDbSet<License>
                {
                   new License { Customerid = 956980, OrderId = 401789 },
                   new License { Customerid = 1039733, OrderId = 423132 }
                };

                mockData.Setup(m => m.License).Returns(license);

                var orderdetails = new FakeDbSet<OrderDetails>
                {
                    new OrderDetails { OrderId = 401789, ProductID = 7703 },
                    new OrderDetails { OrderId = 401789, ProductID = 7002 }                   
                };

                mockData.Setup(m => m.OrderDetails).Returns(orderdetails);

                return mockData.Object;
            }

Хотя макет этого кода со значением, присутствующим во всех используемых таблицах, макет работает нормально. Но если значение не указано в таблице «Заказы», ​​я получаю следующую ошибку:

Message: Object reference not set to an instance of an object.

Source: Anonymously Hosted DynamicMethods Assembly

Пример: для customerid = 956980, макет работает нормально, но для другого customerid = 1039733 выдает исключение, поскольку у клиента нет записи в таблице заказов.

Может кто-нибудь помочь, как справиться с издевательством для подобных случаев?

1 Ответ

0 голосов
/ 12 сентября 2018

Попробуй это. Может произойти сбой в случае операций с базой данных, но для макетов все будет хорошо из-за операций concise.

flatLicenseOrderId = (from users in this.CustomerEntities.UserMappers
                                        .Where(x=>x.CompanyId==CompanyId && x.IsActive)
                      join order in this.CustomerEntities.Orders 
                           on users.customerid equals order.customerid 
                      into orderDetails
                      from customerOrder in orderDetails.DefaultIfEmpty()
                      join orderdetails in this.CustomerEntities.OrderDetails
                      on customerOrder?.OrderId equals orderdetails.OrderId
                      select new{users.customerid,orderdetails.OrderId})
                     .Distinct().ToList();
...