栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用Entity Framework Core模拟异步存储库

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用Entity Framework Core模拟异步存储库

感谢@Nkosi为我指向的链接提供了在EF 6中执行相同操作的示例:https ://msdn.microsoft.com/zh-cn/library/dn314429.aspx
。这与EF Core并不完全一样,但是我能够从它开始并进行修改以使其正常工作。下面是我创建的用于“模拟” IAsyncQueryProvider的测试类:

internal class TestAsyncQueryProvider<TEntity> : IAsyncQueryProvider{    private readonly IQueryProvider _inner;    internal TestAsyncQueryProvider(IQueryProvider inner)    {        _inner = inner;    }    public IQueryable CreateQuery(expression expression)    {        return new TestAsyncEnumerable<TEntity>(expression);    }    public IQueryable<TElement> CreateQuery<TElement>(expression expression)    {        return new TestAsyncEnumerable<TElement>(expression);    }    public object Execute(expression expression)    {        return _inner.Execute(expression);    }    public TResult Execute<TResult>(expression expression)    {        return _inner.Execute<TResult>(expression);    }    public IAsyncEnumerable<TResult> ExecuteAsync<TResult>(expression expression)    {        return new TestAsyncEnumerable<TResult>(expression);    }    public Task<TResult> ExecuteAsync<TResult>(expression expression, CancellationToken cancellationToken)    {        return Task.FromResult(Execute<TResult>(expression));    }}internal class TestAsyncEnumerable<T> : EnumerableQuery<T>, IAsyncEnumerable<T>, IQueryable<T>{    public TestAsyncEnumerable(IEnumerable<T> enumerable)        : base(enumerable)    { }    public TestAsyncEnumerable(expression expression)        : base(expression)    { }    public IAsyncEnumerator<T> GetEnumerator()    {        return new TestAsyncEnumerator<T>(this.AsEnumerable().GetEnumerator());    }    IQueryProvider IQueryable.Provider    {        get { return new TestAsyncQueryProvider<T>(this); }    }}internal class TestAsyncEnumerator<T> : IAsyncEnumerator<T>{    private readonly IEnumerator<T> _inner;    public TestAsyncEnumerator(IEnumerator<T> inner)    {        _inner = inner;    }    public void Dispose()    {        _inner.Dispose();    }    public T Current    {        get        { return _inner.Current;        }    }    public Task<bool> MoveNext(CancellationToken cancellationToken)    {        return Task.FromResult(_inner.MoveNext());    }}

这是我使用这些类的更新的测试用例:

[Fact]public async Task GetCompanyProductURLAsync_ReturnsNullForInvalidCompanyProduct(){    var companyProducts = Enumerable.Empty<CompanyProductUrl>().AsQueryable();    var mockSet = new Mock<DbSet<CompanyProductUrl>>();    mockSet.As<IAsyncEnumerable<CompanyProductUrl>>()        .Setup(m => m.GetEnumerator())        .Returns(new TestAsyncEnumerator<CompanyProductUrl>(companyProducts.GetEnumerator()));    mockSet.As<IQueryable<CompanyProductUrl>>()        .Setup(m => m.Provider)        .Returns(new TestAsyncQueryProvider<CompanyProductUrl>(companyProducts.Provider));    mockSet.As<IQueryable<CompanyProductUrl>>().Setup(m => m.expression).Returns(companyProducts.expression);    mockSet.As<IQueryable<CompanyProductUrl>>().Setup(m => m.ElementType).Returns(companyProducts.ElementType);    mockSet.As<IQueryable<CompanyProductUrl>>().Setup(m => m.GetEnumerator()).Returns(() => companyProducts.GetEnumerator());    var contextOptions = new DbContextOptions<SaasDispatcherDbContext>();    var mockContext = new Mock<SaasDispatcherDbContext>(contextOptions);    mockContext.Setup(c => c.Set<CompanyProductUrl>()).Returns(mockSet.Object);    var entityRepository = new EntityRepository<CompanyProductUrl>(mockContext.Object);    var service = new CompanyProductService(entityRepository);    var result = await service.GetCompanyProductURLAsync(Guid.NewGuid(), "wot", Guid.NewGuid());    Assert.Null(result);}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/416793.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号