2013-08-18 4 views
1

Я работаю над приложением WebAPI с помощью RavenDB. У меня есть несколько XUnit тестов, которые имеют вид аналогичной схеме:Несколько тестов с RavenDB

var checkQuery = session.Query<Resource>().Where(x => x.AliasIds.Any(a => a == alias.Id)); 
PAssert.Throws<InvalidOperationException>(() => checkQuery.Single()); 

var testString = Guid.NewGuid().ToString(); 
Controller.Post(testString); 

var res = checkQuery.Single(); 
PAssert.IsTrue(() => res != null); 

Что происходит, что, когда у меня есть несколько тестов, проведенных в то же время они терпят неудачу на линии

var res = checkQuery.Single(); 

С исключение:

Результат Сообщение: System.InvalidOperationException: Последовательность не содержит элементов

То, что я нашел:

  • Он отлично работает, если я получил первый вызов checkQuery.Single() прокомментировал.
  • Это нормально работает, если я добавляю Thread.Sleep (1000) перед проблемной строкой.

Я пытался добавить

store.DatabaseCommands.DisableAllCaching(); 
store.Conventions.ShouldCacheRequest = _ => false; 

, но это не помогло.

ответ

2

Предполагая, что Controller.Post(testString) добавляет новую запись, вы, вероятно, просто имеете устаревший индекс. В реальном мире некоторое количество времени будет проходить между почтой и запросом. В единичных испытаний, вы не имеете, что задержка, так что общее, чтобы обеспечить следующее на индексе:

.Customize(x => x.WaitForNonStaleResults()) 

Это не то, что вы должны сделать в производстве. Вы можете прочитать больше in the documentation here.

+0

Не проверял, если это еще ответ, но есть ли способ настроить его таким образом в конфигурации магазина где-нибудь? –

+0

См. Http://stackoverflow.com/a/9059083/634824 –