如何使用rhino mock测试异步查询

本文关键字:异步 查询 测试 mock 何使用 rhino | 更新日期: 2023-09-27 18:11:56

以下是我的函数

 public async Task<IEnumerable<Books>> GetAsync(Guid customerId) {
        var BookList= await _bookStore.FindBy(AnExpression(customerId)).ToListAsync();
        return vehicleList;
    }

我试着嘲笑bookStore。返回IQueryable 的FindBy((方法

  var Books= new List<Books>(2){
                new Books(),
                new Books()
            }.AsQueryable();
 mock.Expect(viewStore => viewStore.FindBy(Arg<Expression<Func<Books, bool>>>.Is.Anything)).Return(Books);

viewStore是一个接口:

public interface IRepository<T> : IDisposable where T : class
{
    IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
}

我得到以下错误

系统。InvalidOperationException:源IQueryable未实现IDbSyncEnumerable。只有实现IDbSyncEnumerable的源才能用于实体框架异步操作

我尝试实现AsyncQueryProviderhttps://msdn.microsoft.com/en-us/data/dn314429#async

但是使用Moq而不是Rhino mock显示了实现。

如何使用rhino mock测试异步查询

您必须使用在您提供的链接中实现的TestDbAsyncEnumerable

替换:

var Books= new List<Books>(2){
            new Books(),
            new Books()
        }.AsQueryable();
mock.Expect(viewStore => viewStore.FindBy(Arg<Expression<Func<Books, bool>>>.Is.Anything))
    .Return(Books);

带有:

var Books = new List<Books>(2){
            new Books(),
            new Books()
        }.AsQueryable();
var asycEnumarable = new TestDbAsyncEnumerable<Books>(Books);
var viewStore = MockRepository.GenerateStub<IRepository<Books>>();
viewStore.Stub(x => x.FindBy(Arg<Expression<Func<Books, bool>>>.Is.Anything))
         .Return(asycEnumarable);