0

我在 ABP 项目中使用Effort进行测试时遇到问题。

据我了解,我的问题出在EntityFramework.DynamicFilters上,GitHub 中有一个问题在讨论这个问题。但似乎确实有一种解决方法对我有用。

当我运行我的测试时,所有使用 DynamicFilters 的操作都不起作用。(其他测试确实按预期工作。)

这个问题有解决方案吗?如果是这样,我需要安装哪个版本?

我想在我的测试中继续使用 DynamicFilters,因为这是我的业务逻辑的一部分。

我正在使用以下版本:

  • ABP 3.8.2(模板 ASP.NET MVC 5.x)
  • Effort 1.3.9(也用 1.3.0 和 1.3.3 测试过)
  • NMemory 2.0.3(也用 1.1.2 测试过)

非常感谢您的帮助!


这是错误日志:

结果堆栈跟踪:  
在 EntityFramework.DynamicFilters.DynamicFilterExtensions.SetParameterList(IEnumerable paramValueCollection,DbParameter 参数,DbCommand 命令,DbContext 上下文)
   在 EntityFramework.DynamicFilters.DynamicFilterExtensions.SetSqlParameters(DbContext 上下文,DbCommand 命令)
   在 EntityFramework.DynamicFilters.DynamicFilterCommandInterceptor.SetDynamicFilterParameterValues(DbCommand 命令,DbContext 上下文)
   在 EntityFramework.DynamicFilters.DynamicFilterCommandInterceptor.ReaderExecuting(DbCommand 命令, DbCommandInterceptionContext`1 interceptionContext)
   在 System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.b__d(IDbCommandInterceptor i, DbCommand t, DbCommandInterceptionContext`1 c)
   在 System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget 目标, Func`3 操作, TInterceptionContext interceptionContext, Action`3 执行, Action`3 执行)
   在 System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand 命令,DbCommandInterceptionContext 拦截上下文)
   在 System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior 行为)
   在 System.Data.Common.DbCommand.ExecuteReader(CommandBehavior 行为)
   在 System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior 行为)
   在 System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext 上下文,ObjectParameterCollection 参数值)
   在 System.Data.Entity.Core.Objects.ObjectQuery`1.c__DisplayClass7.b__6()
   在 System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
   在 System.Data.Entity.Core.Objects.ObjectQuery`1.c__DisplayClass7.b__5()
   在 System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute[TResult](Func`1 操作)
   在 System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   在 System.Data.Entity.Core.Objects.ObjectQuery`1..GetEnumerator>b__0()
   在 System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
   在 System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 源)
   在 System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.b__1[TResult](IEnumerable`1 序列)
   在 System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 查询,表达式 queryRoot)
   在 System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[TResult](表达式表达式)
   在 System.Data.Entity.Internal.Linq.DbQueryProvider.Execute[TResult](表达式表达式)
   在 System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 源,Expression`1 谓词)
   在 Abp.Domain.Repositories.AbpRepositoryBase`2.FirstOrDefault(TPrimaryKey id) en D:\Github\aspnetboilerplate\src\Abp\Domain\Repositories\AbpRepositoryBase.cs:línea 107
   在 Castle.Proxies.KpiRepositoryProxy.FirstOrDefault_callback(Int32 id)
   在 Castle.Proxies.Invocations.AbpRepositoryBase`2_FirstOrDefault.InvokeMethodOnTarget()
   在 Castle.DynamicProxy.AbstractInvocation.Proceed()
   在 Abp.Domain.Uow.UnitOfWorkInterceptor.PerformSyncUow(IInvocation 调用,UnitOfWorkOptions 选项) en D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkInterceptor.cs:línea 67
   在 Abp.Domain.Uow.UnitOfWorkInterceptor.PerformUow(IInvocation 调用,UnitOfWorkOptions 选项) en D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkInterceptor.cs:línea 59
   在 Abp.Domain.Uow.UnitOfWorkInterceptor.Intercept(IInvocation 调用) en D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkInterceptor.cs:linea 49
   在 Castle.DynamicProxy.AbstractInvocation.Proceed()
   在 Castle.Proxies.KpiRepositoryProxy.FirstOrDefault(Int32 id)
   在 Abp.Domain.Repositories.AbpRepositoryBase`2.Get(TPrimaryKey id) en D:\Github\aspnetboilerplate\src\Abp\Domain\Repositories\AbpRepositoryBase.cs:linea 75
   在 Castle.Proxies.KpiRepositoryProxy.Get_callback(Int32 id)
   在 Castle.Proxies.Invocations.AbpRepositoryBase`2_Get.InvokeMethodOnTarget()
   在 Castle.DynamicProxy.AbstractInvocation.Proceed()
   在 Abp.Domain.Uow.UnitOfWorkInterceptor.PerformSyncUow(IInvocation 调用,UnitOfWorkOptions 选项) en D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkInterceptor.cs:línea 67
   在 Abp.Domain.Uow.UnitOfWorkInterceptor.PerformUow(IInvocation 调用,UnitOfWorkOptions 选项) en D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkInterceptor.cs:línea 59
   在 Abp.Domain.Uow.UnitOfWorkInterceptor.Intercept(IInvocation 调用) en D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkInterceptor.cs:linea 49
   在 Castle.DynamicProxy.AbstractInvocation.Proceed()
   在 Castle.Proxies.KpiRepositoryProxy.Get(Int32 id)
   在 MyCompany.Student.Services.KpiOwnerAppService.UpdateRootKpi(UpdateRootKpiInput 输入) 中 C:\Users\gzanoletti\source\repos\MyCompany\Student\Services\KpiOwnerAppService.cs:linea 261
   在 Castle.Proxies.KpiOwnerAppServiceProxy.UpdateRootKpi_callback(UpdateRootKpiInput 输入)
   在 Castle.Proxies.Invocations.IKpiOwnerAppService_UpdateRootKpi.InvokeMethodOnTarget()
   在 Castle.DynamicProxy.AbstractInvocation.Proceed()
   在 Abp.Authorization.AuthorizationInterceptor.Intercept(IInvocation invocation) 中 D:\Github\aspnetboilerplate\src\Abp\Authorization\AuthorizationInterceptor.cs:linea 20
   在 Castle.DynamicProxy.AbstractInvocation.Proceed()
   在 Abp.Domain.Uow.UnitOfWorkInterceptor.PerformSyncUow(IInvocation 调用,UnitOfWorkOptions 选项) en D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkInterceptor.cs:línea 67
   在 Abp.Domain.Uow.UnitOfWorkInterceptor.PerformUow(IInvocation 调用,UnitOfWorkOptions 选项) en D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkInterceptor.cs:línea 59
   在 Abp.Domain.Uow.UnitOfWorkInterceptor.Intercept(IInvocation 调用) en D:\Github\aspnetboilerplate\src\Abp\Domain\Uow\UnitOfWorkInterceptor.cs:linea 49
   在 Castle.DynamicProxy.AbstractInvocation.Proceed()
   在 Abp.Auditing.AuditingInterceptor.PerformSyncAuditing(IInvocation invocation, AuditInfo auditInfo) en D:\Github\aspnetboilerplate\src\Abp\Auditing\AuditingInterceptor.cs:línea 56
   在 Abp.Auditing.AuditingInterceptor.Intercept(IInvocation 调用) 中 D:\Github\aspnetboilerplate\src\Abp\Auditing\AuditingInterceptor.cs:linea 41
   在 Castle.DynamicProxy.AbstractInvocation.Proceed()
   在 Abp.Runtime.Validation.Interception.ValidationInterceptor.Intercept(IInvocation 调用) en D:\Github\aspnetboilerplate\src\Abp\Runtime\Validation\Interception\ValidationInterceptor.cs:linea 33
   在 Castle.DynamicProxy.AbstractInvocation.Proceed()
   在 Castle.Proxies.KpiOwnerAppServiceProxy.UpdateRootKpi(UpdateRootKpiInput 输入)
   在 MyCompany.Student.KpiOwnerAppService_Test.Update_Kpi_Trend_Test() 中 C:\Users\gzanoletti\source\repos\MyCompany\Tests\MyCompany.Tests\Student\KpiOwnerAppService_Test.cs:linea 71
结果消息:System.NullReferenceException:对象引用未设置为对象的实例。

这些是我正在使用的过滤器:

modelBuilder.Filter(GlobalDataFilters.OwnerFilter, (IOwner obj, int ownerId) => (obj.OwnerId == ownerId), 0);

modelBuilder.Filter(GlobalDataFilters.ListOfOwnerFilter, (IOwner obj, List<int> ownerIds) => ownerIds.Contains(obj.OwnerId), new List<int>());

modelBuilder.Filter(
    GlobalDataFilters.DateRangeFilter,
    (IDateRange obj, DateTime startDate, DateTime endDate) => (startDate <= obj.EndDate && endDate >= obj.StartDate),
    new DateTime(Clock.Now.Year, 1, 1), new DateTime(Clock.Now.Year, 12, 31));

modelBuilder.Filter(GlobalDataFilters.OwnersFilter, (IOwners obj, List<int> ownerIds) => obj.Owners.Any(o => ownerIds.Contains(o.Id)), new List<int>());

modelBuilder.Filter(GlobalDataFilters.ListOfProvidersFilter, (IProvider obj, List<int> providerIds) => obj.ProviderId.HasValue && providerIds.Contains(obj.ProviderId.Value), new List<int>());

modelBuilder.Filter(
    GlobalDataFilters.HasCreationTimeFilter,
    (IHasCreationTime obj, DateTime startDate, DateTime endDate) => (startDate <= obj.CreationTime && obj.CreationTime <= endDate),
    new DateTime(Clock.Now.Year, 1, 1), 
    new DateTime(Clock.Now.Year, 12, 31),
    dynamicFilterConfig => dynamicFilterConfig.SelectEntityTypeCondition(type => typeof(MyClass1).IsAssignableFrom(type)));

modelBuilder.Filter(GlobalDataFilters.LeaderFilter, (ILeader obj, int leaderId) => (obj.LeaderId == leaderId), 0);

modelBuilder.Filter(GlobalDataFilters.ListOfLeadersFilter, (ILeader obj, List<int> leaderIds) => leaderIds.Contains(obj.LeaderId), new List<int>());
4

0 回答 0