Search code examples
c#.netunit-testingnunit

How Moq UnitOfWork with IQueryable


i have method

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

and i try create tests

[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);
    }
    

} and i try create test i am add mock of repository Map to unit of work and then create provider

    [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);
        
    }

when i start test i see error

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

i think problem in SetupEntity()...how correct mock repository?


Solution

  • for me help=> using using MockQueryable.Moq;

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