Specs2单元规格参考

时间:2019-07-18 11:37:32

标签: scala specs2

我有以下规格:

import org.specs2.mutable.{After, Specification}
import org.specs2.specification.Scope
import org.specs2.specification.core.{Fragment, Fragments}

class TestRefSpec extends Specification {

  "My Spec" >> new iii {
    xxx(i)
  }

  def xxx(i: Int) = {
    def e1 = {
      println(s"** $i > 0")
      i must be_>(0)
    }
    def e2 = {
      println(s"** $i < 100")
      i must be_<(100)
    }

    "i should be > 0" >> { e1 } 
    "and < 100" >> { e2 }
  }

}

trait iii extends Scope with After {
  val i = 142

  def after = println("finalising")
}

这个想法是,有一个规范可以测试某事物的行为,然后有一个由作用域所代表的目标。 理想情况下,行为应具有单独的特征。 遗憾的是,尽管我得到的输出运行如下:

[info] TestRefSpec
[info] + My Spec
[info] Total for specification TestRefSpec
[info] Finished in 560 ms
[info] 1 example, 0 failure, 0 error

这意味着测试不会真正运行。

有人知道我实际上如何实现我的目标吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为问题在于您将xxx(i)方法调用包装在new iii {}中。

这是行不通的,因为curlies内部的代码是在扩展了iii的新匿名类的构造函数中执行的,并且整个表达式的结果是iii的子类型,而不是Fragments,因此您在xxx()方法内部构造并返回的示例内部结构无法使用specs2 >>运算符。 通常情况下,只有单个示例带有-在specs2 in运算符之前包装在范围中。

这将起作用:

class TestRefSpec extends Specification {

  "My Spec" >> {
    xxx(42)
  }

  def xxx(i: Int) = {
    def e1 = {
      println(s"** $i > 0")
      i must be_>(0)
    }
    def e2 = {
      println(s"** $i < 100")
      i must be_<(100)
    }

    "i should be > 0" in new iii { e1 }
    "and < 100" in new iii { e2 }
  }

}