2012-01-30 3 views
10

Я использую RavenDB в режиме In-Memory для модульного тестирования. Мои запросы поддерживаются статическими индексами. Я не использую API WaitForNonStaleResults() (и не хочу).Как следует обрабатывать индексы во время тестирования?

Типичный рабочий процесс для теста:

  1. Initialise RavenDB в режиме В-памяти
  2. Интегрировать индексы с использованием IndexCreation.CreateIndexes(Assembly, IDocumentStore)
  3. тест Вставка данных (для проверки поведение запроса)
  4. Выполнить запрос
  5. Проверка вывода запроса

Я заметил, что шаги 1-3 происходят так быстро, что статические индексы не успевают обновиться до шага 4 - поэтому индексы устарели.

Я создал для этого быстрое обходное решение. После шага 3 я выполняю:

while (documentStore.DocumentDatabase.Statistics.StaleIndexes.Length != 0) 
    Thread.Sleep(10); 

Это кажется громоздким. Что я хотел бы знать:

  • Нормально ли для индексов быть устаревшими при запуске RavenDB в режиме «Память»?
  • Есть ли лучший способ избежать устаревших индексов во время тестирования?

ответ

14

Переведено на RavenDB usergroup и имеет рабочее решение.

Нормально ли для индексов быть устаревшими при запуске RavenDB во встроенной памяти режим?

Да. Индекс - это индекс.

Есть ли лучший способ избежать устаревших индексов во время тестирования?

Да. Настройка глобальных конвенций при инициализации документа магазина:

var store = new EmbeddableDocumentStore(); 
store.RunInMemory = true; 
store.Conventions = new DocumentConvention 
{ 
    DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites 
}; 

store.Initialize(); 

Примечания:ConsistencyOptions.QueryYourWrites не работают с Map/Reduce индексов, т.е. индексы с Reduce => ... секции. Для этого вы должны использовать Customize(x => x.WaitForNonStale...()) при запросе

Update: Существует another approach, что может быть лучше (не лично пробовал еще). Вы можете реализовать IDocumentQueryListener, чтобы заставить все запросы возвращать нестатические результаты:

var store = new EmbeddableDocumentStore { RunInMemory = true }; 
store.Initialize(); 

store.RegisterListener(new ForceNonStaleQueryListener()); 

public class ForceNonStaleQueryListener : IDocumentQueryListener 
{ 
    public void BeforeQueryExecuted(IDocumentQueryCustomization customization) 
    { 
     queryCustomization.WaitForNonStaleResults(); 
    } 
} 
+0

@MattWarren Спасибо, Мэтт. Полезно знать. –

+0

Подход Listener больше не действует с текущими сборками RavenDB. – nathanchere

+0

@FerretallicA Я проверю это снова с помощью последней сборки. –

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