You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:40:57