[英]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.