gpt4 book ai didi

c# - 源 IQueryable 的提供程序未实现 IAsyncQueryProvider

转载 作者:太空狗 更新时间:2023-10-29 21:07:48 30 4
gpt4 key购买 nike

我有一些如下代码,我想编写单元测试我的方法。但我被困在异步方法中。你能帮我吗 ?

public class Panel
{
public int Id { get; set; }
[Required] public double Latitude { get; set; }
public double Longitude { get; set; }
[Required] public string Serial { get; set; }
public string Brand { get; set; }
}

public class CrossSolarDbContext : DbContext
{
public CrossSolarDbContext()
{
}

public CrossSolarDbContext(DbContextOptions<CrossSolarDbContext> options) : base(options)
{
}

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}
}

public interface IGenericRepository<T>
{
Task<T> GetAsync(string id);

IQueryable<T> Query();

Task InsertAsync(T entity);

Task UpdateAsync(T entity);
}

public abstract class GenericRepository<T> : IGenericRepository<T>
where T : class, new()
{
protected CrossSolarDbContext _dbContext { get; set; }

public async Task<T> GetAsync(string id)
{
return await _dbContext.FindAsync<T>(id);
}

public IQueryable<T> Query()
{
return _dbContext.Set<T>().AsQueryable();
}

public async Task InsertAsync(T entity)
{
_dbContext.Set<T>().Add(entity);
await _dbContext.SaveChangesAsync();
}

public async Task UpdateAsync(T entity)
{
_dbContext.Entry(entity).State = EntityState.Modified;
await _dbContext.SaveChangesAsync();
}
}

public interface IPanelRepository : IGenericRepository<Panel> { }

public class PanelRepository : GenericRepository<Panel>, IPanelRepository
{
public PanelRepository(CrossSolarDbContext dbContext)
{
_dbContext = dbContext;
}
}

[Route("[controller]")]
public class PanelController : Controller
{
private readonly IPanelRepository _panelRepository;

public PanelController(IPanelRepository panelRepository)
{
_panelRepository = panelRepository;
}

// GET panel/XXXX1111YYYY2222
[HttpGet("{panelId}")]
public async Task<IActionResult> Get([FromRoute] string panelId)
{
Panel panel = await _panelRepository.Query().FirstOrDefaultAsync(x => x.Serial.Equals(panelId, StringComparison.CurrentCultureIgnoreCase));
if (panel == null) return NotFound();
return Ok(panel);
}
}

public class PanelControllerTests
{
private readonly PanelController _panelController;
private static readonly Panel panel = new Panel { Id = 1, Brand = "Areva", Latitude = 12.345678, Longitude = 98.7655432, Serial = "AAAA1111BBBB2222" };

private readonly IQueryable<Panel> panels = new List<Panel>() { panel }.AsQueryable();
private readonly Mock<IPanelRepository> _panelRepositoryMock = new Mock<IPanelRepository>();

public PanelControllerTests()
{
_panelRepositoryMock.Setup(x => x.Query()).Returns(panels);
// I also tried this. I got another error 'Invalid setup on an extension method: x => x.FirstOrDefaultAsync<Panel>(It.IsAny<Expression<Func<Panel, Boolean>>>(), CancellationToken)'
// _panelRepositoryMock.As<IQueryable<Panel>>().Setup(x => x.FirstOrDefaultAsync(It.IsAny<Expression<Func<Panel, bool>>>(), default(CancellationToken))).ReturnsAsync(panel);
_panelController = new PanelController(_panelRepositoryMock.Object);
}

[Fact]
public async Task Register_ShouldInsertOneHourElectricity()
{
IActionResult result = await _panelController.Get("AAAA1111BBBB2222");
Assert.NotNull(result);
var createdResult = result as CreatedResult;
Assert.NotNull(createdResult);
Assert.Equal(201, createdResult.StatusCode);
}
}

我遇到了这个错误

The provider for the source IQueryable doesn't implement IAsyncQueryProvider. Only providers that implement IEntityQueryProvider can be used for Entity Framework asynchronous operations.

我认为我需要模拟“FirstOrDefaultAsync”,但我不确定也不知道该怎么做。我尝试了一些东西,但是无法编译。

最佳答案

我今天遇到了这个问题,这个库为我解决了这个问题 https://github.com/romantitov/MockQueryable完整请引用:

模拟 Entity Framework 核心操作,例如 ToListAsyncFirstOrDefaultAsync

//1 - create a List<T> with test items
var users = new List<UserEntity>()
{
new UserEntity{LastName = "ExistLastName", DateOfBirth = DateTime.Parse("01/20/2012")},
...
};

//2 - build mock by extension
var mock = users.AsQueryable().BuildMock();

//3 - setup the mock as Queryable for Moq
_userRepository.Setup(x => x.GetQueryable()).Returns(mock.Object);

//3 - setup the mock as Queryable for NSubstitute
_userRepository.GetQueryable().Returns(mock);

关于c# - 源 IQueryable 的提供程序未实现 IAsyncQueryProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51023223/

30 4 0