【问题标题】:C# ElasticSeach Mock SuggestionsC# ElasticSearch 模拟建议
【发布时间】:2015-10-08 17:30:13
【问题描述】:

我试图模拟一个建议响应,但是 suggestionOption.Setup(x => x.Text).Returns("Hello") 正在引发异常:

System.NotSupportedException 类型的异常发生在 Moq.dll 但未在用户代码中处理其他信息: 非虚拟(在 VB 中可覆盖)成员的设置无效:x => x.Text


       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;

【问题讨论】:

    标签: elasticsearch moq


    【解决方案1】:

    您不能模拟非虚拟方法。正如错误所述:

    Invalid setup on non-virtual member
    

    Moq 通过充当您的代码和真实类之间的代理来发挥其魔力。它通过利用虚拟方法来做到这一点。没有虚方法,Moq 无法拦截调用。

    【讨论】:

    • 谢谢帕特里克,在这种情况下我有什么选择?只是让我的测试调用 Elastic 实例?
    【解决方案2】:

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

    看起来你的嘲笑水平可能太低了。如果您不想调用 Elastic 来获取您的建议列表,那么可以使用一个仅返回字符串数组(或您自己的自定义 Suggestion 类)的方法并对其进行模拟。

    或者只是真正地调用 Elastic,只要您传递不返回数千个建议的合理值。

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

    【讨论】:

      猜你喜欢
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多