gpt4 book ai didi

c# - 对返回类型和参数使用泛型

转载 作者:行者123 更新时间:2023-11-30 15:13:34 25 4
gpt4 key购买 nike

我正在编写大量单元测试,由于我们框架的特殊性,每个单元测试都需要这个使用 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;

}

这是正确的方法还是我应该使用其他方法,例如动态参数?

----- 编辑 -----

这是通用方法的最终版本,感谢 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://learn.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
}
}

关于c# - 对返回类型和参数使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57800282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com