规范和规格2:如何在specs2中实现doBefore {}?

时间:2014-04-25 11:57:58

标签: scala specs2 specs

我很难与#34;转移"我的scala测试类中的内容从specs到specs2。我的最后一件事是doBefore{}和一些"test" in {}

的问题

我的"testing" should { doBefore{} 和一些 "getting" in {} }给了我这个错误

描述资源路径位置类型

  

无法找到类型的证据参数的隐含值   org.specs2.execute.AsResult [单位]

我认为" Unit"是我的项目中的课程,但doBeforein {}都没有返回任何内容,因此我不知道最新情况。

我的doBefore只是填写了一些带有随机值的类(例如,这个类是extends SpecificationWithJUnit with TestUtil with BeforeExample with AfterExample

"retrieving and counting users by criteria" should {

    var user1: User = null
    var user2: User = null
    var user3: User = null

    doBefore {
        val params = Map("login" -> "notExist", "roles" -> Seq(someRoles).asJava
        val params2 = Map("login" -> "notExistAnother", "roles" -> Seq(someRoles).asJava
        val params3 = Map("login" -> "notExistAnotherAnother", "roles" -> Seq(someRoles).asJava).asJava
        val users = Seq(params, params2, params3).map( { PopulateUser.insertUserParams(_).asInstanceOf[User] })
        user1 = users(0)
        user2 = users(1)
        user3 = users(2)
    }

我对Scala很陌生,但我读过specs2 doBefore看起来不同但是说实话,我不知道如何在我的代码中实现它。我在看this。所以有人知道我应该如何在我的代码中实现这一点,并且导致了什么(我的意思是差异beetwen specs和specs2是巨大的,但不知何故我的测试(在doBefore旁边)很少产生同样的错误)

2 个答案:

答案 0 :(得分:1)

您的测试没有测试。方法中的最后一个表达式是方法的返回值,该值必须是 specs2 可以转换为结果的值。您返回的最后一个值是之前的结果单位,无法转换为测试**结果**。这是给出的错误的来源。

could not find implicit value for evidence parameter of type org.specs2.execute.AsResult[Unit]

doBefore ,因为你使用它很好,但之后应该进行某种测试。

有关详细信息,请查看http://etorreborre.github.io/specs2/guide/org.specs2.guide.Structure.html#Structure,其中有一个特殊部分,描述如何使用之前之后与Specs2单位和验收测试。

通常,您可以通过切换到验收测试样式获得更多收益。

答案 1 :(得分:0)

specs2中的上下文管理方式与规范不同。如果要在一组示例之前执行操作,则需要创建Step

"retrieving and counting users by criteria" should {

var user1: User = null
var user2: User = null
var user3: User = null

step {
  val params = Map("login" -> "notExist", "roles" -> Seq(someRoles).asJava
  val params2 = Map("login" -> "notExistAnother", "roles" -> Seq(someRoles).asJava
  val params3 = Map("login" -> "notExistAnotherAnother", "roles" -> Seq(someRoles).asJava).asJava
    val users = Seq(params, params2, params3).map( { PopulateUser.insertUserParams(_).asInstanceOf[User] })
  user1 = users(0)
  user2 = users(1)
  user3 = users(2)
}

"first example" >> ...

如果您想在每个示例之前执行某些代码,请混合使用BeforeExample特征并实施before方法。

最后,如果您想避免使用变量并将一些数据传递给每个示例,您可以使用FixtureExample[T]特征:

class MySpec extends Specification with FixtureExample[Data] {
  def fixture[R : AsResult](f: Data => R) = {
    val data: Data = ??? // prepare data
    AsResult(f(data))
  }

  "a group of example" >> {
    "example1" >> { data: Data =>
      ok
    }
  }
}