2015-10-07 4 views
0

Я пытаюсь издеваться ответ предложить, однако suggestionOption.Setup(x => x.Text).Returns("Hello") бросает исключение:C# ElasticSeach Мок Предложения

Исключение типа System.NotSupportedException произошло в Moq.dll, но не был обработан в коде пользователя Дополнительная информация: Недопустимые установки на невиртуальном (Overridable в VB) член: х => 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; 

ответ

1

Вы не можете высмеивать не виртуальные методы. При возникновении ошибки:

Invalid setup on non-virtual member 

Moq делает свою магию, действуя как прокси-сервер между вашим кодом и настоящим классом. Он делает это, используя виртуальные методы. Без виртуального метода Moq не может перехватить вызов.

+0

Спасибо, Патрик, какие у меня варианты в этом случае? Просто чтобы мои тесты вызывали экземпляр Elastic вместо этого? –

1

Ни предложения SuggestionOption, ни предложения не могут быть легко вылеплены, поскольку они имеют не виртуальные внутренние свойства на основе набора и не реализуют какой-либо конкретный интерфейс.

Похоже, вы, возможно, насмехаетесь над слишком низким уровнем. Если вы не хотите называть Elastic, чтобы получить список предложений, тогда вы получите метод, который просто возвращает массив строк (или ваш собственный класс предложений) и вместо этого имитирует.

Или просто позвоните Эластик на самом деле, пока вы проходите в разумных значениях, которые не возвращают тысячи предложений.

(Или вы могли бы теоретически создавать экземпляры предложения и устанавливать внутренние свойства посредством отражения, но это не идеально).

Смежные вопросы