簡體   English   中英

Entity Framework Core FromSql 模擬測試用例

[英]Entity Framework Core FromSql mock test cases

我正在使用帶有 get 存儲過程調用的 EF Core 非實體模型。 請參閱下面的示例代碼

context.Query<ClassDTO>().FromSql("SpName @Param1, @Param2, @Param3", 
                                  new SqlParameter[] { param1, param2, param3 }).ToList();

代碼工作正常。 但是我需要編寫模擬測試用例。

誰能幫我嗎? 如何模擬Context.Query或如何為此代碼編寫測試用例?

我試圖實現以下方式:

https://nodogmablog.bryanhogan.net/2017/11/unit-testing-entity-framework-core-stored-procedures/

但它適用於 ** productContext.Products.MockFromSql(...)

但對我來說它就像 productContext.Query.MockFromSql()。 所以建議我如何編寫測試用例。

提前致謝。

濕婆

DbQuery<TQuery>設置的實際 FromSql 模擬與DbSet<TEntity>相同,因此 OP 鏈接是相關的(盡管它是一個全面的實現,如果您需要匹配您需要的 FromSql sql/參數進行額外的模擬設置;警告:它很快就會變得丑陋)。

您需要使用可查詢序列模擬DbQuery<TQuery> ,根據 OP 鏈接模擬查詢提供程序(擴展為您需要的任何特定模擬匹配),然后將 DbQuery 模擬對象分配給 DbContext .Query<TQuery>()方法和 DbContext DbQuery<TQuery>屬性。

在模擬 DbQuery 方面,這就是我用來創建的:

public static Mock<DbQuery<TQuery>> CreateDbQueryMock<TQuery>(this DbQuery<TQuery> dbQuery, IEnumerable<TQuery> sequence) where TQuery : class {
    var dbQueryMock = new Mock<DbQuery<TQuery>>();

    var queryableSequence = sequence.AsQueryable();

    dbQueryMock.As<IAsyncEnumerableAccessor<TQuery>>().Setup(m => m.AsyncEnumerable).Returns(queryableSequence.ToAsyncEnumerable);
    dbQueryMock.As<IQueryable<TQuery>>().Setup(m => m.ElementType).Returns(queryableSequence.ElementType);
    dbQueryMock.As<IQueryable<TQuery>>().Setup(m => m.Expression).Returns(queryableSequence.Expression);
    dbQueryMock.As<IEnumerable>().Setup(m => m.GetEnumerator()).Returns(queryableSequence.GetEnumerator());
    dbQueryMock.As<IEnumerable<TQuery>>().Setup(m => m.GetEnumerator()).Returns(queryableSequence.GetEnumerator()); 
    dbQueryMock.As<IQueryable<TQuery>>().Setup(m => m.Provider).Returns(queryableSequence.Provider);

    return dbQueryMock;
}

然后,如果我需要支持 FromSql,我將提供程序更改為查詢提供程序模擬(根據 OP 為 CreateQuery 設置的模擬):

mock.As<IQueryable<TEntity>>().Setup(m => m.Provider).Returns(queryProviderMock.Object);

如果您想節省一些時間,我最終將上述內容包裝在一個庫中: https : //github.com/rgvlee/EntityFrameworkCore.Testing

暫無
暫無

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

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