Я генерирую elasticsearch queries для клиента NACT при расстановке моего собственного простого языка запроса. То есть анализатор возвращает QueryDescriptor
(который представляет собой псевдоним для Func<QueryContainerDescriptor<SearchResult>, QueryContainer>
), что тогда можно использовать для получения результатов поиска от Elasticsearch.
Когда вход представляет собой запрос, как {nestedObject.someField:someValue
, следующий метод GetQueryDescriptor
с query == "nestedObject.someField:someValue"
будет вызван.
// NestedObjectQueryToken.cs
public Func<QueryContainerDescriptor<SearchResult>, QueryContainer> GetQueryDescriptor(string query)
{
// GetFieldNames() extracts the fields that the user search in from the query
// (there could possibly be more than one field present)
var nestedFields = query.GetFieldNames().Select(fieldName => new Field("nestedObject." + fieldName));
return descriptor => descriptor.NestedFieldSearch(query, _ => _.Fields(fields));
}
// QueryDescriptorExtensions.cs
public static QueryContainer NestedFieldSearch(this QueryContainerDescriptor<SearchResult> descriptor,
string query, FieldsDescriptor nestedFields)
{
return descriptor.Nested(n => n
.Path("nestedObject")
.Query(sub => sub
.QueryString(queryString => queryString
.Query(query)
.Fields(nestedFields))))
}
SearchResult
- это класс, который используется для отображения результатов.
Позже QueryDescriptor
наносится на SearchDescriptor<SearchResult>
, чтобы его можно было использовать в методе гнезда Search
.
Я ожидаю, что QueryDescriptor
имеет определенные свойства. В приведенном выше примере он должен содержать вложенный запрос со своими полями внутреннего запроса, установленным на «NestedObject.somefield».
Теперь я хочу проверить это свойство с помощью модульного теста, то есть без отправки запроса на сервер.
Как я могу «заглянуть внутрь QueryDescriptor
», чтобы утверждать, что его свойства, как и ожидалось?
1 ответ
Вы можете достичь этого, отличая ваш контейнер для запроса результатов в IQueryContainer
QueryContainer Query(QueryContainerDescriptor<Document> q) =>
q.Term(t => t.Field(f => f.Name).Value("something"));
var actual = Query(new QueryContainerDescriptor<Document>()) as IQueryContainer;
Assert.AreEqual("something", actual.Term.Value);
Надеюсь, это поможет.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.