Вот минимальный репро моего класса, который обеспечивает связь с Elasticsearch через гнездо 1.7:Как издеваться над методом IElasticClient Get?
public class PeopleRepository
{
private IElasticClient client;
public PeopleRepository(IElasticClient client)
{
this.client = client;
}
public Person Get(string id)
{
var getResponse = client.Get<Person>(p => p.Id(id));
// Want to test-drive this change:
if (getResponse.Source == null) throw new Exception("Person was not found for id: " + id);
return getResponse.Source;
}
}
Как отмечалось в коде, я пытаюсь тест-драйв определенное изменение. Я использую NUnit 2.6.4 и Moq 4.2, чтобы попытаться сделать это, следующим образом:
[Test]
public void RetrieveProduct_WhenDocNotFoundInElastic_ThrowsException()
{
var clientMock = new Mock<IElasticClient>();
var getSelectorMock = It.IsAny<Func<GetDescriptor<Person>, GetDescriptor<Person>>>();
var getRetvalMock = new Mock<IGetResponse<Person>>();
getRetvalMock
.Setup(r => r.Source)
.Returns((Person)null);
clientMock
.Setup(c => c.Get<Person>(getSelectorMock))
.Returns(getRetvalMock.Object);
var repo = new PeopleRepository(clientMock.Object);
Assert.Throws<Exception>(() => repo.Get("invalid-id"));
}
Однако я высмеивал различные ElasticClient биты неправильно: метод Get
на IElasticClient
возвращает нуль, таким образом, вызывая исключение NullReferenceException на getResponse.Source
, прежде чем мой код получит, чтобы выбросить исключение, которое я хочу его бросить.
Как правильно высмеять метод Get<T>
на IElasticClient
?
Wow, супер быстрый ответ. Рад, что я спросил, не думал об этом: O – Jeroen