簡體   English   中英

我怎樣才能返回 IQueryable<TEntity> 來自模擬對象的對象?

[英]How can I return IQueryable<TEntity> object from a mock object?

我試圖告訴GetAll()對象_portalUserRepositoryMock上的方法GetAll()返回IQueryable<TEntity>類型的對象。 我知道它是這種類型,因為要測試的類中的方法返回這種類型。

我一直想不出解決辦法。 我看到了這篇文章,但在嘗試將包含到我的項目中時出錯。 關於 Microsoft.EntityFrameworkCore 版本的一些問題 - 這導致了更多問題。

我為得到這個錯誤所做的是:

_portalUserRepositoryMock = Substitute.For<IPortalUserRepository>();
_portalUserRepositoryMock.GetAll().Returns(fakeQueryablePUser.AsQueryable());

被測類使用這樣的存儲庫:

var portal = await _portalUserRepository.GetAll().Include(p => 
p.Portal).Where(p => p.UserId == user.Id && p.Portal.PortalType == 
dto.PortalType).FirstOrDefaultAsync();

GetAll()方法是:

        public IQueryable<TEntity> GetAll()
    {
        try
        {
            return DbContext.Set<TEntity>().AsNoTracking();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

我收到此錯誤:

消息:System.InvalidOperationException:源 IQueryable 的提供程序未實現 IAsyncQueryProvider。 只有實現 IEntityQueryProvider 的提供程序才能用於實體框架異步操作。

我認為我收到此錯誤是因為正在使用FirstOrDefaultAsync() 只是不知道如何解決它。

編輯:我現在已經能夠將 MockQueryable 庫添加到我的測試項目中(使用版本 1.0.4 而不是最新的 1.1.0 )。 我已按照步驟操作,如下所示:

        var fakePortalUser = new PortalUser()
        {
            PortalId = new Guid()
        };

        var fakeQueryablePUser = new List<PortalUser>
        {
            fakePortalUser
        }.AsQueryable().BuildMock();

最后一步是現在使用GetQueryable() 我嘗試在這里使用:

_portalUserRepositoryMock.GetAll().GetQueryable().Returns(fakeQueryablePUser);

但是我在GetQueryable()方法調用下得到了紅色波浪線。 所以代碼不會編譯。

最初的問題是你懷疑FirstOrDefaultAsync 該擴展希望可查詢對象也具有IAsyncQueryProvider以匹配模擬默認情況下不會的異步 EF。

刪除.GetQueryable()因為您不需要它。 該成員來自演示如何使用模擬庫的示例之一。

還要確保假數據中包含與Where中的謂詞匹配的數據。

.Where(p => p.UserId == user.Id && p.Portal.PortalType == dto.PortalType)

如果沒有要枚舉的元素, FirstOrDefault將返回null

如果數據不滿足過濾器,默認情況下您將返回null

你不知道, IQueryable<T>是由實體框架/核心處理的實現細節。 除非您的業務邏輯實際上創建了IQueryable<T>的實現,否則您希望返回一個模擬存根對象。

即(請注意,這使用庫Moq來模擬對象,因為我不確定您正在使用什么並且實現可能會有所不同。)

_mockedEntityQuery = new Mock<IQueryable<T>>();
_portalUserRepositoryMock = Substitute.For<IPortalUserRepository>();
_portalUserRepositoryMock.GetAll().Returns(_mockedEntityQuery.Object);

如果您返回IQueryable<T>的實例,您還將測試該實現,該實現已經由 EF 單元測試完成。 單元測試應該只測試單元范圍內的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM