首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# ElasticSeach模拟建议

C# ElasticSeach模拟建议
EN

Stack Overflow用户
提问于 2015-10-07 19:03:40
回答 2查看 310关注 0票数 0

我试图嘲弄一个建议响应,但是suggestionOption.Setup(x => x.Text).Returns("Hello")抛出了一个异常:

System.NotSupportedException类型的异常发生在Moq.dll中,但未在用户代码中处理附加信息:在非虚拟成员(VB中可覆盖)上的安装无效:x => x.Text。

代码语言:javascript
复制
       var searchSuggestResponseMock = new Mock<ISuggestResponse>();

        var suggestionOption = new Mock<SuggestOption>();
        suggestionOption.Setup(x => x.Text).Returns("Hello");
        suggestionOption.Setup(x => x.Payload).Returns("{path:\"drugs/hello\"}");

        var suggestion = new Mock<Suggest>();
        suggestion.Setup(x => x.Options).Returns(new List<SuggestOption> { suggestionOption.Object });

        searchSuggestResponseMock.Setup(x => x.Suggestions).Returns(new Dictionary<string, Suggest[]>()
        {
              {"suggest", new Suggest[] {suggestion.Object}},
        });

        var mock = new Mock<IConnector>();
        mock.Setup(x => x.getClient()
            .Suggest<Term>(Moq.It.IsAny<Func<SuggestDescriptor<Term>,
            SuggestDescriptor<Term>>>())).Returns(searchSuggestResponseMock.Object);

        _connector = mock.Object;
EN

回答 2

Stack Overflow用户

发布于 2015-10-08 02:05:10

你不能模仿非虚拟的方法。正如错误声明的那样:

代码语言:javascript
复制
Invalid setup on non-virtual member

Moq通过充当代码和实际类之间的代理来实现它的魔力。它通过利用虚拟方法来做到这一点。如果没有虚拟方法,Moq就无法拦截呼叫。

票数 1
EN

Stack Overflow用户

发布于 2015-10-08 09:30:13

SuggestionOption和Suggest都不是很容易模仿的,因为它们具有非虚拟的、基于内部集的属性,并且没有实现任何特定的接口。

看上去你可能在太低的水平上嘲弄。如果您不想调用弹性来获取建议列表,那么就有一个方法,它只返回一个字符串数组(或您自己的自定义建议类),然后进行模拟。

或者,只要你传递的是不返回数千条建议的合理值,就可以直接调用弹性。

(或者,理论上您可以创建建议的实例,并通过反射设置内部属性,但这显然并不理想)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33000388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档