模拟entity framework长LINQ查询
有一个想要测试模拟entity framework的LINQ查询表达式(如下)。 要模拟我正在使用代码:使用模拟框架的entity framework测试这适用于其他查询,但不适用于此
var query = from vwPs in _reportingDbContext.VwAccountNumber join ps in _reportingDbContext.PaymentSummary on new { Key1 = vwPs.Id, Key2 = vwPs.AccountNumber, Key3 = true, Key4 = true } equals new { Key1 = ps.Id, Key2 = ps.AccountNumber, Key3 = ps.PaymentDate >= fromDateTime, Key4 = ps.PaymentDate < toDateTime } into viewJoinPayment from ps in viewJoinPayment.DefaultIfEmpty() join prg in generatedReportIds on ps.PaymentRef equals prg into paymentJoinGenerated from prgRow in paymentJoinGenerated.DefaultIfEmpty() where vwPs.Id == Id select new { vwPs.AccountNumber, Payments = ps, ReportGenerated = prgRow };
在代码中此时执行查询’_inner’中的值
internal class TestDbAsyncEnumerator : IDbAsyncEnumerator { //... public Task MoveNextAsync(CancellationToken cancellationToken) { return Task.FromResult(_inner.MoveNext()); } //...
}
? _inner {System.Linq.Enumerable.WhereSelectEnumerableIterator < f__AnonymousType11 < f__AnonymousType10 < f__AnonymousType9 < f__AnonymousType7>,LL.Core.DataAccess.Models.PaymentSummaryEntity>,System.Collections.Generic.IEnumerable>,int>, f__AnonymousType12>}当前:null
结果视图:扩展结果视图将枚举IEnumerable
并且当它执行MoveNext()时获取exception
? _inner.MoveNext()’_inner.MoveNext()’引发了类型’System.NullReferenceException’的exception数据:{System.Collections.ListDictionaryInternal} HResult:-2147467261 HelpLink:null InnerException:null消息:“对象引用未设置为一个对象的实例。“ 来源:“匿名托管DynamicMethods程序集”StackTrace:“在System.Linq.Enumerable的<lambda_method(Closure, f__AnonymousType9
2 )\r\n at System.Linq.Enumerable.d__40
4.MoveNext()\ r \ n在System.Linq。 Enumerable.d__223.MoveNext()\r\n at System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext()“TargetSite:{Int32 lambda_method(System.Runtime.CompilerServices.Closure, f__AnonymousType92[f__AnonymousType7
2 [ LL.Core.DataAccess.Models.VwAccountNumberEnt ity,System.Collections.Generic.IEnumerable`1 [LL.Core.DataAccess.Models.PaymentSummaryEntity]],LL.Core.DataAccess.Models.PaymentSummaryEntity])}
尝试了一些变化,包括在这里DbSet mock中建议的那些,其次在调用ToList时没有结果
但仍然遇到同样的问题。 拜托,任何人都可以发光吗?
validation使用集成测试的查询实现不是一个选项,因为老板希望在unit testing级别测试它作为所有其他查询。
更新:感谢@Eduard Malakhov这是尝试过的事情。 如果删除’DefaultIfEmpty’并运行查询,它不会抛出exception。 但是如何使用DefaultIfEmpty避免exception呢? 如何修改模拟代码来检查这种情况,因为未模拟的调用没有发生exception?
var query = from vwPs in _charityReportingDbContext.VwCharityAccountNumber join ps in _charityReportingDbContext.PaymentSummary on new { Key1 = vwPs.CharityId, Key2 = vwPs.AccountNumber, Key3 = true, Key4 = true } equals new { Key1 = ps.CharityId, Key2 = ps.AccountNumber, Key3 = ps.PaymentDate >= fromDateTime, Key4 = ps.PaymentDate < toDateTime } into viewJoinPayment select new { vwPs.AccountNumber, };
我的hacky’解决方案’(星期五,想回家:)。 删除exception,但不幸的是,没有给出正确的结果。
public Task MoveNextAsync(CancellationToken cancellationToken){ try { return Task.FromResult(_inner.MoveNext()); } catch (Exception ex) { return Task.FromResult(false); }}