2016-01-18 6 views
0

Вот минимальный репро моего класса, который обеспечивает связь с 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?

ответ

4

Вы не можете использовать метод It.IsAny вне звонка Setup, иначе он будет считать его нулевым. Перемещение It.IsAny в установку должно работать:

clientMock 
     .Setup(c => c.Get<Person>(It.IsAny<Func<GetDescriptor<Person>, GetDescriptor<Person>>>())) 
     .Returns(getRetvalMock.Object); 
+0

Wow, супер быстрый ответ. Рад, что я спросил, не думал об этом: O – Jeroen

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