首页 > 解决方案 > C# 单元测试模拟 DbSet 错误,IQueryable 未实现 IAsyncEnumerable

问题描述

我有下面的测试,并在 DbSet/Context 上使用标准模拟。测试运行时失败,因为它指出“源 IQueryable 未实现 IAsyncEnumerable Team。只有实现 IAsyncEnumerable 的源才能用于实体框架异步操作”。

        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
        }

服务本身很简单

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

标签: c#entity-frameworkmocking

解决方案


推荐阅读