2013-05-17 2 views
1

Я работаю над тестом интеграции. Поскольку мы используем NServiceBus Saga с ravendb как хранилище, для теста интеграции мне нужно удалить все документы в хранилище raven для каждого тестового примера. Поскольку это хранилище saga NServiceBus, тип документа в Raven Db не известен в тесте интеграции. В основном мне нужно прочитать все документы (любой тип) и удалить их. Я с нетерпением жду, чтобы написать запрос в сеансе ravendb, чтобы получить все документы из конкретной базы данных. Когда я проверил метод запроса Raven Db Query, он ожидает тип документа. В то время как мне нужно запросить все документы в базе данных без типа. FYI, так как это тест интеграции, ворон магазин не будет иметь много записей. Таким образом, производительность не является проблемой.Запросить все документы, если тип неизвестен

Вот запрос, который я пытаюсь выполнить.

"from doc in docs let DocId = doc[\"@metadata\"][\"@id\"] select new {DocId};" 

Решение 1:

Я также пытался создать индекс для вышеупомянутого запроса и выполняется DeleteByIndex. Это фактически удаляет все документы в базе данных. Но он работает для определенных тестовых случаев и бросает исключение в другой тестовый пример, говорящий, что «Stale Index». Я также нашел решение, в котором код мог дождаться завершения индекса, чтобы избежать устаревшего исключения. Или установите allowstale в true, чтобы избежать этого исключения. Я думал, что вместо того, чтобы проходить через все индексирование, почему я не могу просто написать запрос, чтобы получить все документы и удалить их.

Решение 2: Я нашел другое решение, которое удаляет папку документа ravendb. Это не сработает для моей ситуации, потому что шина NServices будет генерировать исключение, если база данных будет удалена при запуске оконного процессора NServiceBus. Это нарушает наши тестовые примеры интеграции. Другая причина, по которой интеграционный тест будет работать на разных машинах, чем машина ravendb. Таким образом, тестовое окно интеграции может не иметь доступа к папке окна ravendb.

Это все причины, по которым я хочу написать запрос для извлечения всех документов из базы данных и их удаления.

Любая помощь приветствуется.

ответ

1

Я бы предположил, что вы используете способность Raven работать в качестве базы данных в памяти в рамках ваших интеграционных тестов. Это даст вам совершенно новую базу данных в любое время, когда вы этого захотите.

Для ваших тестов вместо DocumentStore создайте EmbeddableDocumentStore (также реализует IDocumentStore) и используйте опцию конфигурации RunInMemory.

+0

Как я сказал в вопросе, Ravendb используется в качестве NServiceBus Saga документа магазина и управляется NServicesBus. – Amzath

+1

Но вы можете ввести пользовательский ISagaPersister, который использует сервер Raven в памяти. –

0

Хотя есть опции для ввода базы данных в памяти, на данный момент я иду по следующему маршруту. Но я хотел бы отметить другой ответ, так как он имеет смысл использовать базу данных в памяти.

Этот код удаляет все документы в базе данных raven. Ради простоты инициализации объекта игнорируется documentstore

using (var session = documentStore.OpenSession(database)) 
      { 
       var result = session.Advanced.LuceneQuery<dynamic>() 
         .SelectFields<dynamic>("@metadata") 
         .Select<dynamic, string>(x => x["__document_id"]) 
         .ToArray(); 

       var loadedDocuments = session.Load<dynamic>(result); 
       foreach (var document in loadedDocuments) 
       { 
        session.Delete(document); 
       } 
       session.SaveChanges(); 
      } 
Смежные вопросы