Я генерирую 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
Flogex 30 Сен 2019 в 16:17

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);

Надеюсь, это поможет.

2
Rob 30 Сен 2019 в 13:36