Moq UnitOfWork 如何使用 IQueryable

How Moq UnitOfWork with IQueryable

我有方法

public async Task<Map[]> GetMapsById(int id, CancellationToken cancellationToken)
        {
            return await this.unitOfWork.Maps
                .AsQueryable()
                .Where(map => map.Id == id)
                .ToArrayAsync(cancellationToken);
        }

然后我尝试创建测试

[TestFixture]
public class LocalMapsTests
{
    private Mock<IUnitOfWork> UnitOfWorkMock;

    [SetUp]
    public void SetUp()
    {
        this.mockRepository = new MockRepository(MockBehavior.Strict);
        this.cancellationToken = CancellationToken.None;
        this.UnitOfWorkMock= this.mockRepository.Create<IUnitOfWork>();
        
    }
    private LocalMapsTests CreateProvider()
    {
        return new LocalMaps(this.mockUnitOfWork.Object);
    }
    private void SetupEntity()
    {
        var maps = new List<Map>
        {
            new Map
            {
                Id = 100
            }
        };

        var repository = new Mock<IRepository<Map>>();
        repository.Setup(x => x.AsQueryable()).Returns(maps.AsQueryable());
        this.mockUnitOfWork
            .Setup(x => x.Maps)
            .Returns(repository.Object);
    }
    

} 我尝试创建测试 我将存储库映射的模拟添加到工作单元,然后创建提供者

    [Test]
    public async Task GetMapsById_ShouldReturn_Maps()
    {
        // Arrange
        this.SetupEntity();

        LocalMapsProvider provider = this.CreateProvider();

        // Act
        var act = await provider.GetMapsById(100,this.cancellationToken);

        // Assert
        act.Should().BeOfType<Maps>();
        Assert.NotNull(act);
        
    }

当我开始测试时我看到错误

System.InvalidOperationException : The source 'IQueryable' doesn't implement 'IAsyncEnumerable<Models.Map>'. Only sources that implement 'IAsyncEnumerable' can be used for Entity Framework asynchronous operations.

我认为 SetupEntity() 中存在问题...如何正确模拟存储库?

对我有帮助=> 使用 MockQueryable.Moq;

repository.Setup(x => x.AsQueryable()).Returns(roadmaps.AsQueryable().BuildMock().Object);