[英]Use Generics for Return Type and Parameter
我正在編寫很多單元測試,並且由於我們框架的細節,每個人都需要這個使用DbSet
和某些類型的模擬。 唯一的區別是類型,所以我想避免多次重復相同的方法,如果可能的話,有一個(也許)通用方法。 使用EF 6,.Net 4.7.1
這就是我現在擁有的:
private Mock<DbSet<MyClass>> MockSetupForDbSet(List<MyClass> expected)
{
var mockDbSet = new Mock<DbSet<MyClass>>();
mockDbSet.As<IQueryable<MyClass>>()
.Setup(m => m.Provider)
.Returns(new TestDbAsyncQueryProvider<MyClass>(expected.AsQueryable().Provider));
mockDbSet.As<IQueryable<MyClass>>().Setup(m => m.Expression).Returns(expected.AsQueryable().Expression);
return mockDbSet;
}
這就是我需要的:
private Mock<DbSet<T>> MockSetupForDbSet(List<T> expected) where T : class
{
var mockDbSet = new Mock<DbSet<T>>();
mockDbSet.As<IQueryable<T>>()
.Setup(m => m.Provider)
.Returns(new TestDbAsyncQueryProvider<T>(expected.AsQueryable().Provider));
mockDbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(expected.AsQueryable().Expression);
return mockDbSet;
}
這是正確的方法還是應該使用其他方法,例如dynamic
參數?
-----編輯-----
這是泛型方法的最終版本,感謝StackOverflow成員的幫助(以防將來幫助某人):
internal static Mock<DbSet<T>> MockSetupForDbSet<T>(List<T> expected) where T : class
{
var mockDbSet = new Mock<DbSet<T>>();
mockDbSet.As<IQueryable<T>>()
.Setup(m => m.Provider)
.Returns(new TestDbAsyncQueryProvider<T>(expected.AsQueryable().Provider));
mockDbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(expected.AsQueryable().ElementType);
mockDbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(expected.AsQueryable().GetEnumerator());
mockDbSet.As<IDbAsyncEnumerable<T>>()
.Setup(m => m.GetAsyncEnumerator())
.Returns(new TestDbAsyncEnumerator<T>(expected.GetEnumerator()));
mockDbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(expected.AsQueryable().Expression);
return mockDbSet;
}
測試是基於編寫的,取決於Microsoft文檔“使用模擬框架測試”: https : //docs.microsoft.com/en-us/ef/ef6/fundamentals/testing/mocking#async
包括泛型類型參數
This
|
V
Mock<DbSet<T>> MockSetupForDbSet<T>(List<T> expected) where T : class {
//...omitted for brevity
}
如果該函數不是泛型類的一部分
class MyClass<T> {
Mock<DbSet<T>> MockSetupForDbSet(List<T> expected) where T : class {
//...omitted for brevity
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.