Elasticsearch InnerHits及泛型方法Mock失败,求解决方案
解决Elasticsearch InnerHits及自定义泛型方法的Mock问题
一、Mock InnerHitsResult的Documents泛型方法
你用SetupGet报错是因为Documents<T>()是方法而非属性,SetupGet仅适用于属性操作。正确做法是用Setup配合泛型方法表达式:
// 基于Moq框架示例 var mockInnerHits = new Mock<InnerHitsResult>(); var testBooks = new List<Book> { new Book { Id = 1, Title = "Test Book" } }; // 针对指定泛型类型的方法进行Mock mockInnerHits.Setup(s => s.Documents<Book>()) .Returns(testBooks.AsReadOnly());
若需支持任意泛型类型,可使用It.IsAnyType匹配:
mockInnerHits.Setup(s => s.Documents<It.IsAnyType>()) .Returns((Type t) => { // 根据类型动态生成模拟数据,示例用反射创建空列表 var listType = typeof(List<>).MakeGenericType(t); return Activator.CreateInstance(listType); });
二、Mock自定义类BlogSearchResult的Document泛型方法
如果Document<T>()是实例方法,直接用Setup指定目标泛型类型即可:
var mockBlogResult = new Mock<BlogSearchResult>(); var testBlog = new Blog { Id = 1, Content = "Test Blog" }; // 针对Blog类型的泛型方法做Mock mockBlogResult.Setup(s => s.Document<Blog>()) .Returns(testBlog);
若该方法是静态方法,Moq无法直接Mock静态成员,可采取以下两种方案:
- 重构代码,将静态方法封装到接口中改为实例方法,再进行Mock;
- 使用支持静态Mock的框架(如Moq扩展包
Moq.Static、JustMock等)。
关键注意事项
- 严格区分方法和属性:
Setup用于方法Mock,SetupGet/SetupSet仅针对属性; - 泛型方法Mock时,必须明确指定泛型参数(或用
It.IsAnyType匹配任意类型); - 若自定义类的泛型方法是密封类的非虚方法,Moq无法Mock,需重构代码引入抽象层(如接口)。
内容的提问来源于stack exchange,提问作者Carrie Kaski
相关产品推荐
相关产品推荐

