Управление сессиями RavenDb для WCF и интеграционное тестирование - PullRequest
2 голосов
/ 31 января 2012

Проще говоря, у меня есть служба WCF, которая управляет яблоками. Помимо других функций, у него есть два способа добавления и удаления яблок из хранилища. Я пишу интеграционный тест, чтобы проверить, получает ли кто-то эту работу и надрезает яблоки. Raven DB в моей службе WCF выполняет роль аудита, она просто записывает действия и яблоки. В методах службы WCF есть и другая обработка: очистка, проверка, упаковка и т. Д.

Мой тест интеграции аудита может быть выражен как

  • Пустое хранилище (режим RavenDB в памяти)
  • Приходит Боб и кладет 10 яблок (открыть сессию, добавить, удалить сессию)
  • Джейк приходит и берет 4 яблока (открыть сеанс, удалить, удалить сеанс)
  • Проверьте, что осталось 6 яблок

Поскольку это два разных человека (два вызова WCF), имеет смысл использовать разные экземпляры сеанса. Тем не менее, с Raven DB я получаю

Исключение

Apple не связана с сеансом, не может удалить неизвестную сущность Экземпляр

Если я сейчас запустил аналогичный интеграционный тест, когда два разных человека просто добавляют яблок в хранилище, общий объем хранилища соответствует истине. Это немного сбивает с толку: добавление работает через сеанс, удаление не работает. В этом посте Айенде говорит, что микроуправление сеансами - это не тот путь, но мне кажется естественным использовать разные сеансы в моем интеграционном тестировании. Надеюсь, аналогия с яблоками не оттолкнет вас.

Вопрос: Как использовать сеансы в интеграционном тестировании с RavenDB?

Пример кода (из блокнота)

public void Remove(Apple apple)
{
    using (var session = Store.OpenSession())
    {
        session.Delete(apple);
        session.SaveChanges();      
    }
}

public void Add(Apple apple)
{
    using (var session = Store.OpenSession())
    {
        session.Store(apple);
        session.SaveChanges();      
    }
}

...

var apples = new apples[10];
//init
MyRavenDB.Add(apples);
MyRavenDB.Remove(apples.Take(4)); //throws here
//verify

Ответы [ 2 ]

3 голосов
/ 31 января 2012

Вы передаете сущности по проводам, и это, как правило, большое нет-нет. Сделайте это так:

 public void Remove(string appleId)

Это даст вам гораздо лучшую семантику.

3 голосов
/ 31 января 2012

В RavenDB, "Сеанс управляет отслеживанием изменений для всех сущностей, которые он либо загрузил, либо сохранил" .

Я подозреваю, что ссылка Apple, которую вы передаете методу Remove(), возникла не из хранилища документов RavenDB, следовательно, ошибка.

Попробуйте это:

public void Remove(Apple apple)
{
    using (var session = Store.OpenSession())
    {
        var entity = session.Load<Apple>(apple.Id);

        session.Delete(entity);
        session.SaveChanges();      
    }
}
...