我已经使用假数据库上下文实现了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();
下面是我的Mocking背景,
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;
}
在使用所有使用的表中存在的值模拟此代码时,模拟工作正常。但是如果该值不在Orders表中,则会出现以下错误:
Message: Object reference not set to an instance of an object.
Source: Anonymously Hosted DynamicMethods Assembly
示例:对于customerid = 956980,模拟工作正常,但对于另一个customerid = 1039733,则产生异常,因为客户在Order表中没有条目。
有人可以帮忙,如何处理这类案件的嘲笑?
试试这个。在数据库操作的情况下它可能会失败,但对于模型,它会因为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();