1

I have the test below and am using standard mocking on a DbSet/Context. When the test runs it fails as it states that "The source IQueryable doesn't implement IAsyncEnumerable Team. Only sources that implement IAsyncEnumerable can be used for Entity Framework asynchronous operations".

        public async Task Get_team_name_with_valid_search_term_returns_team_names()
        {
            // Arrange
            var data = new List<Team>
            {
                new Team {Name = "Leeds"},
                new Team {Name = "Glasgow"}
            }.AsQueryable();

            var mockSet = new Mock<DbSet<Team>>();

            mockSet.As<IQueryable<Team>>().Setup(m => m.Provider).Returns(data.Provider);
            mockSet.As<IQueryable<Team>>().Setup(m => m.Expression).Returns(data.Expression);
            mockSet.As<IQueryable<Team>>().Setup(m => m.ElementType).Returns(data.ElementType);
            mockSet.As<IQueryable<Team>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

            var mockContext = new Mock<RadContext>();
            mockContext.Setup(c => c.Team).Returns(mockSet.Object);

            var service = new ITeamSearchService(mockContext.Object);

            // Act
            var result = await service.GetTeamName("Gla");

            // Assert
        }

The service itself is quite simple

 public async Task<List<SearchTeamResponse>> GetTeamName(string searchTerm)
      {
            if (searchTerm == null)
            {
                throw new ArgumentNullException(nameof(searchTerm));
            }

            var query = await _radContext.Team.Where(x => x.Name.StartsWith(searchTerm))
                .OrderBy(x => x.Name)
                .ToListAsync();

            var json = JsonConvert.SerializeObject(query);

            var result = JsonConvert.DeserializeObject<List<SearchTeamResponse>>(json);

            return result;
        }
LeedsWalker
  • 189
  • 1
  • 3
  • 13
  • I ran into this issue some time ago when looking at fully embracing `IQueryable` in my repository and some of the challenges faced when testing async operations. The solution was outlined here: https://stackoverflow.com/questions/41324783/unit-testing-tolistasync-using-an-in-memory/41327224 Basically adding the test provider and enumerator, then where you want to return a stub IQueryable result, return a `TestDbAsyncEnumerable` wrapped collection. – Steve Py Aug 05 '20 at 21:34
  • @StevePy - thanks for the article, unfortunately IDbAsyncQueryProvider is no longer recognised in entity framework core as i think they have changed the interfaces. – LeedsWalker Aug 06 '20 at 11:19
  • A quick search revealed this for the alternative in EF Core: https://stackoverflow.com/questions/39719258/idbasyncqueryprovider-in-entityframeworkcore EF Core is always in a bit of flux but it should have an alternative wrapper for accommodating async. – Steve Py Aug 06 '20 at 21:32

0 Answers0