C# System.NotSupportedException:不支持的表达式:x=>x

C# System.NotSupportedException:不支持的表达式:x=>x,c#,unit-testing,moq,C#,Unit Testing,Moq,我目前正在尝试moq我的Cafe-Get方法,如果找不到Cafe-ID,该方法将抛出ArgumentNullexception 错误 System.NotSupportedException:不支持的表达式:x=>x.Cafe 此处不可重写的成员:在设置/验证表达式中不能使用Context.get_Cafe 发生这种情况是因为moq无法处理其中一个设置表达式吗 单元测试 [事实] 公共异步任务GetCafeByIdAsync\u应\u引发\u ArgumentNullException { va

我目前正在尝试moq我的Cafe-Get方法,如果找不到Cafe-ID,该方法将抛出ArgumentNullexception

错误 System.NotSupportedException:不支持的表达式:x=>x.Cafe 此处不可重写的成员:在设置/验证表达式中不能使用Context.get_Cafe

发生这种情况是因为moq无法处理其中一个设置表达式吗

单元测试 [事实] 公共异步任务GetCafeByIdAsync\u应\u引发\u ArgumentNullException { var cafe=新列表 { 新咖啡馆{Name=Hanna,CafeId=1}, 新咖啡馆{Name=Bella,CafeId=2} }.AsQueryable; var mockSet=新模拟; mockSet.As.Setupm=>m.Provider.Returnscafe.Provider; mockSet.As.Setupm=>m.Expression.Returnscafe.Expression; mockSet.As.Setupm=>m.ElementType.Returnscafe.ElementType; mockSet.As.Setupm=>m.GetEnumerator.Returnscafe.GetEnumerator; var mapper=new MapperConfigurationcfg=> { cfg.addProfile新建AutoMapperProfile; }.CreateMapper; var contextMock=新模拟; contextMock.Setupx=>x.Cafe.ReturnsmockSet.Object;//此处失败 var cafeService=新的CafeServicecontextMock.Object,映射器; 等待Assert.ThrowsAsync=>cafeService.Get2; } 苏特 公共异步任务Getint cafeId { var cafe=await_context.cafe.Wherew=>w.CafeId==CafeId.ToResponse.FirstOrDefaultAsync; 返回新版本响应 { 数据=咖啡馆 }; }
Moq依赖于能够创建覆盖属性的代理类。无法重写Context.Cafe。尝试将该属性声明为虚拟


Moq依赖于能够创建覆盖属性的代理类。无法重写Context.Cafe。尝试将该属性声明为虚拟

请改为尝试在Set方法上安装mock

public virtual DbSet<TEntity> Set<TEntity>() where TEntity : class;
就你而言

var contextMock = new Mock<Context>();
contextMock.Setup(x => x.Set<Cafe>()).Returns(mockSet.Object);
请改为尝试在Set方法上安装mock

public virtual DbSet<TEntity> Set<TEntity>() where TEntity : class;
就你而言

var contextMock = new Mock<Context>();
contextMock.Setup(x => x.Set<Cafe>()).Returns(mockSet.Object);

cafe当前设置为so->public DbSet cafe{get;set;}在将属性声明为虚拟时是否也需要IDbSet?现在,当我将其更改为虚拟->Castle.DynamicProxy.InvalidProxyConstructorArgumentsException:无法实例化类的代理:TestProject.Data.Context时,出现此错误。找不到无参数构造函数。@rey123:我认为IDbSet不是必需的:我只是在模拟接口方面比在这里发现的类更幸运。听起来您要么需要向上下文添加无参数构造函数,要么停止尝试模拟它。:-考虑实现一个接口,并嘲笑这个接口。是否有其他方法可以测试公共异步任务GETIN CAFEID——因为它似乎是在使用上下文,所以认为最好是模仿上下文,如果上下文是注入接口ICONTEXT,那么CAFE就在那个接口上,然后您应该能够模拟IContext.cafe当前的设置,如so->public DbSet cafe{get;set;}将属性声明为虚拟时是否也需要IDbSet?我现在将其更改为虚拟->Castle.DynamicProxy.InvalidProxyConstructorArgumentsException:无法实例化类的代理:TestProject.Data.Context。找不到无参数构造函数。@rey123:我认为IDbSet不是必需的:我只是在模拟接口方面比在这里发现的类更幸运。听起来您要么需要向上下文添加无参数构造函数,要么停止尝试模拟它。:-考虑实现一个接口,并嘲笑这个接口。是否有其他方法可以测试公共异步任务GETIN CAFEID——因为它似乎是在使用上下文,所以认为最好是模仿上下文,如果上下文是注入接口ICONTEXT,那么CAFE就在那个接口上,然后你应该能够模拟IContext。我建议根据你的EF版本使用以下选项之一。它使模拟更加容易。我建议根据您的EF版本使用以下选项之一。它使嘲弄变得更容易。