0

我正在使用 Specs2 编写验收测试。

我想使用ImpermanentGraphDatabase以获得内存中的 Neo4j 图表;非常适合集成测试。

我为 Neo4j 设置了 Spring-Data,我的 Spring 文件配置包含:

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

我想知道该选项destroy-method="shutdown"是否考虑到 Specs2 而不是通常JUnit,以便隔离每个 Spec 的example.

总结一下:每个example人都有自己的内存图实例,还是会被所有人共享?

我猜它不适用,因为 specs2Specification对所有这些 Spec 的示例执行使用相同的实例。事实上,在 Specs2 的函数式风格中,只有一个is()方法被称为在一个实例中包含所有示例。

我还尝试实现该BeforeExample特征以在每个处清理数据库,example但是...使用 Given/Then/When 样式,似乎整个被认为是唯一的example. 实际上,分隔符^不是传统!的 ,后者代表 one example

我想ImpermanentGraphDatabse在每个步骤(GivenWhenThen步骤)之前清理内存数据库()

4

1 回答 1

2

我对您的问题的理解是,您希望在每组 Given/When/Then 步骤之前有一个“新鲜”的数据库。

为此,您可以:

  • 在每组 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)    
    }
    
于 2013-01-24T22:49:20.607 回答