模拟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__22 3.MoveNext()\r\n at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext()“TargetSite:{Int32 lambda_method(System.Runtime.CompilerServices.Closure, f__AnonymousType9 2[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); }}