You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MockQueryable.Moq模拟EF扩展方法ToListAsync失败排查

问题解决:MockQueryable模拟EF Core ToListAsync时抛出NotSupportedException

你的问题出在手动Setup了ToListAsync方法——MockQueryable.Moq库的BuildMockDbSet()已经自动模拟了EF Core所有查询相关的异步扩展方法(包括ToListAsync),手动添加的Setup会和MockQueryable的内置模拟逻辑冲突,导致抛出NotSupportedException。

修正后的测试代码

using FluentAssertions;
using LanguageExt;
using LanguageExt.UnsafeValueAccess;
using Microsoft.EntityFrameworkCore;
using MockQueryable.Moq;
using Moq;
using xxx.Application.Features.Users.Queries.GetAllUserTypes;
using xxx.Application.Interfaces.Services;
using xxx.Domain.Entities;

namespace xxx.UnitTests.Application.Features.Users.Queries
{
    public class GetAllUserTypesQueryUnitTests
    {
        [Fact]
        public async Task Handler_Should_ReturnAllUserTypes()
        {
            // Arrange
            List<AppUserType> userTypes =
            [
                new AppUserType { UserTypeId = 1, UserTypeName = "Type 1" },
                new AppUserType { UserTypeId = 2, UserTypeName = "Type 2" }
            ];

            // 用MockQueryable构建模拟DbSet,无需手动Setup ToListAsync
            Mock<DbSet<AppUserType>> mockSet = userTypes.AsQueryable().BuildMockDbSet();

            Mock<IxxxDbContext> mockContext = new();
            mockContext.Setup(c => c.AppUserTypes).Returns(mockSet.Object);

            GetAllUserTypesQueryHandler handler = new(mockContext.Object);
            GetAllUserTypesQuery query = new();

            // Act
            Option<GetAllUserTypesResult> result = await handler.Handle(query, CancellationToken.None);

            // Assert
            _ = result.IsSome.Should().BeTrue();
            _ = result.ValueUnsafe().UserTypes.Should().BeEquivalentTo(userTypes);
        }
    }
}

关键说明

  • MockQueryable的核心原理是把内存集合包装成实现IQueryable、IAsyncEnumerable等接口的模拟对象,让EF Core的静态扩展方法(比如ToListAsync、FirstAsync)能正常执行,不需要单独模拟这些方法。
  • 如果你手动SetupToListAsync,Moq会尝试拦截这个静态方法的调用,但EF的扩展方法本质是调用DbSet底层的异步枚举接口,手动Setup会破坏MockQueryable的模拟逻辑,导致异常。

内容的提问来源于stack exchange,提问作者Mush-A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:31:19