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);
我有方法
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);