c# - System.NotSupportedException:不支持的表达式:x => x
问题描述
我目前正在尝试最小化我的方法,如果找不到咖啡馆 ID Cafe
Get
,它将抛出一个。ArgumentNullexception
错误
System.NotSupportedException : Unsupported expression: x => x.Cafe Non-overridable members (here: Context.get_Cafe) 不得用于设置/验证表达式。
这是因为 moq 无法处理其中一个设置表达式吗?
单元测试
[Fact]
public async Task GetCafeByIdAsync_Should_Throw_ArgumentNullException()
{
var cafe = new List<Cafe>()
{
new Cafe { Name = "Hanna", CafeId = 1},
new Cafe { Name = "Bella", CafeId = 2 }
}.AsQueryable();
var mockSet = new Mock<DbSet<Cafe>>();
mockSet.As<IQueryable<Cafe>>().Setup(m => m.Provider).Returns(cafe.Provider);
mockSet.As<IQueryable<Cafe>>().Setup(m => m.Expression).Returns(cafe.Expression);
mockSet.As<IQueryable<Cafe>>().Setup(m => m.ElementType).Returns(cafe.ElementType);
mockSet.As<IQueryable<Cafe>>().Setup(m => m.GetEnumerator()).Returns(cafe.GetEnumerator());
var mapper = new MapperConfiguration(cfg =>
{
cfg.AddProfile(new AutoMapperProfile());
}).CreateMapper();
var contextMock = new Mock<Context>();
contextMock.Setup(x => x.Cafe).Returns(mockSet.Object); //failing here
var cafeService = new CafeService(contextMock.Object, mapper);
await Assert.ThrowsAsync<ArgumentNullException>(() => cafeService.Get(2));
}
苏特
public async Task<VersionResponse> Get(int cafeId)
{
var cafe = await _context.Cafe.Where(w => w.CafeId == cafeId).ToResponse().FirstOrDefaultAsync();
return new VersionResponse()
{
Data = cafe
};
}
解决方案
Moq 依赖于能够创建覆盖属性的代理类。Context.Cafe
不能被覆盖。尝试声明该属性virtual
。
public virtual IDbSet<Cafe> Cafe { get; set; }
推荐阅读
- php - 在关联数组php中查找数组
- image-processing - 计算二维点上的切向量
- pyspark - Pyspark 子字符串在 UDF 内部不起作用
- ms-word - 如何根据标题检索和操作 Word 文档的“章节”和“子章节”?
- alexa - 从 Alexa 托管切换到自定义技能后,CloudWatch Logs 不再显示
- reactjs - 如何使用 Nextjs 将我的 URL 与应用程序状态同步
- vue.js - “公共”文件夹中文件的 VUE CLI 不同路径
- php - 数组索引没有按应有的方式执行?
- apache - 使用 WHM 和 apache2 将子域转发到 localhost 的端口
- python - 在 python 中,如何在具有 dtype 对象的列上使用 split('_')?