C#ElasticSeach模拟建议

时间:2015-10-07 19:03:40

标签: elasticsearch moq

我正在尝试模拟建议响应,但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;

2 个答案:

答案 0 :(得分:1)

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

Invalid setup on non-virtual member

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

答案 1 :(得分:1)

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

看起来你可能嘲笑的程度太低了。如果你不想调用Elastic来获取你的建议列表,那么就有一个方法只返回一个字符串数组(或你自己的自定义Suggestion类)并反过来模拟它。

或者只要你传递的是合理的价值而不会返回成千上万的建议,只需将Elastic称为真实。

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