Specs2/Neo4j — Использование ImpermanentGraphDatabase с Specs2

Я пишу приемочный тест, используя Specs2.

Я хочу использовать ImpermanentGraphDatabase, чтобы иметь график Neo4j в памяти; идеально подходит для интеграционного тестирования.

Я настроил Spring-Data для Neo4j, и моя конфигурация файла Spring содержит:

<bean id="graphDatabaseService" class="org.neo4j.test.ImpermanentGraphDatabase" destroy-method="shutdown"/>

Интересно, учитывается ли вариант destroy-method="shutdown" со Specs2 вместо обычного JUnit, чтобы изолировать example каждой спецификации.

Подводя итог: Будет ли каждый example иметь собственный экземпляр графа в памяти или он будет общим для всех?

Я предполагаю, что это неприменимо, поскольку spec2 использует один и тот же экземпляр Specification для выполнения всех этих примеров Spec. Действительно, с функциональным стилем Specs2 вызывается только метод is(), объединяющий все примеры в один экземпляр.

Я также пытался реализовать трейт BeforeExample, чтобы очищать базу данных в каждом example, но... со стилем Given/Then/When кажется, что целое рассматривается как уникальное example. Действительно, разделителем является ^ вместо традиционного !, последний представляет один example.

Я хочу очищать базу данных в памяти (ImpermanentGraphDatabse) перед каждым шагом (Given или When или Then шагом)


person Mik378    schedule 24.01.2013    source источник


Ответы (1)


Насколько я понимаю вашу проблему, вам нужна «свежая» база данных перед каждой группой шагов «Дано/Когда/Тогда».

Для этого вы можете:

  • указать действие явно перед каждой группой шагов Given/When/Then

    Step(cleanupDatabase) ^
    "A given-when-then example for the addition" ^
      "Given the following number: ${1}"         ^ number1 ^
      "And a second number: ${2}"                ^ number2 ^
      "And a third number: ${3}"                 ^ number3 ^
                                                 end^
    Step(cleanupDatabase) ^
    "A given-when-then example for the addition" ^
     "Given the following number: ${1}"         ^ number1 ^
     "And a second number: ${2}"                ^ number2 ^
     "And a third number: ${3}"                 ^ number3 ^
                                             end
    
  • используйте функции для объявления каждой группы и сопоставления шага очистки перед каждым

    def `first example` =     
      "A given-when-then example for the addition" ^
        "Given the following number: ${1}"         ^ number1 ^
        "And a second number: ${2}"                ^ number2 ^
        "And a third number: ${3}"                 ^ number3 ^
                                                   end
    def `second example` =     
      "A given-when-then example for the addition" ^
        "Given the following number: ${1}"         ^ number1 ^
        "And a second number: ${2}"                ^ number2 ^
        "And a third number: ${3}"                 ^ number3 ^
                                                   end
    
    def is = Seq(`first example`, `second example`).foldLeft(Step():Fragments) { (res, cur) =>
      res ^ Step(cleanupDatabase) ^ cur 
    }
    
  • используйте map функцию Спецификации для выполнения это вообще

    override def map(fs: =>Fragments) = fs.flatMap {
      // clean the database at the end of a G/W/T block
      case f if f == end => Seq(Step(cleanDatabase), end)
      case other         => Seq(other)    
    }
    
person Eric    schedule 24.01.2013
comment
Мне нравится последнее предложение, но End() — это недоступный case class (поскольку его поглощающий объект помечен private[specs2]). - person Mik378; 25.01.2013
comment
Правильно, я снял это ограничение, но также проверил свой предыдущий ответ, который не скомпилировался! Я собираюсь отредактировать этот ответ и сделать его немного лучше с помощью последней версии 1.12.4-SNAPSHOT. - person Eric; 12.02.2013