Mock Elastic Search response in.Net
Asked Answered
G

1

5

I have Elastic Search Nest library code and need to mock the response i am getting from elastic search index.

var obj = service.Search<TestDocument>(new student().Query());
var Name= obj.Aggs.Terms("Name");

For Testing : I am creating the Nest object after doing quick watch but facing issue -Aggregations - is a internal protected property and i am not able to set this value.

                           new Nest.KeyedBucket<object>
                           {   
                               Key="XYZ school",
                               KeyAsString=null,
                               Aggregations=new Dictionary<string, IAggregationContainer>{}
                           }

Please suggest solution or any other approach i can use to mock elastic search nest object .

Glassy answered 24/10, 2018 at 13:1 Comment(0)
M
12

If you really want to stub the response from the client, you could do something like the following with Moq

var client = new Mock<IElasticClient>();

var searchResponse = new Mock<ISearchResponse<object>>();

var aggregations = new AggregateDictionary(new Dictionary<string, IAggregate> {
    ["Name"] = new BucketAggregate
    {
        Items = new List<KeyedBucket<object>>
        {
            new Nest.KeyedBucket<object>(new Dictionary<string, IAggregate>())
            {
                Key = "XYZ school",
                KeyAsString = null,
                DocCount = 5
            }
        }.AsReadOnly()
    }
});

searchResponse.Setup(s => s.Aggregations).Returns(aggregations);

client.Setup(c => c.Search<object>(It.IsAny<Func<SearchDescriptor<object>, ISearchRequest>>()))
    .Returns(searchResponse.Object);

var response = client.Object.Search<object>(s => s);

var terms = response.Aggregations.Terms("Name");

Another way would be to use the InMemoryConnection and return known JSON in response to a request..

For testing purposes however, it may be better to have an instance of Elasticsearch running, and perform integration tests against it. Take a look at Elastic.Xunit which provides an easy way to spin up an Elasticsearch cluster for testing purposes. This is used by the client in integration tests.

You can get Elastic.Xunit from the Appveyor feed.

Mahau answered 26/10, 2018 at 9:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.