首页 > 解决方案 > 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
    };
}

标签: c#unit-testingmoq

解决方案


Moq 依赖于能够创建覆盖属性的代理类。Context.Cafe不能被覆盖。尝试声明该属性virtual

public virtual IDbSet<Cafe> Cafe { get; set; }

推荐阅读