【问题标题】:How to access test/example name in Specs2?如何访问 Specs2 中的测试/示例名称?
【发布时间】:2013-04-18 01:32:39
【问题描述】:

我有一些测试共享一个夹具,并希望将这些测试相互隔离。一种方法是使用测试/示例名称作为“命名空间”的一部分(例如,作为目录路径的一部分)。

如何在自身内部访问测试/示例名称?

例如:

class MySpec extends Specification {
  "Something" should {
    "do something" in {
      // access String "do something"
    }

    "do something else" in {
      // access String "do something else"
    }
  }
}

【问题讨论】:

    标签: scala specs2


    【解决方案1】:

    所以你可以通过两种方式做到这一点:

    Specs2 允许您使用字符串作为片段的可选参数,因此您可以执行以下操作:

    class MySpec extends Specification {
      "Something" should {
        "do something" in {
          fragmentName: String =>
            println(fragmentName) //prints do something
            ok
        }
    
        "do something else" in {
          fragmentName: String =>
            println(fragmentName) //prints do something else
            ok
        }
      }
    }
    

    还有一种 hacky 方式(我先玩了这个,但就是不能把它扔掉): 更新 这是@Eric 建议的“更好”的hacky 版本

    class MySpec extends Specification {
      "Something" should {
        "do something" in {
          val fragmentName = is.examples(0).desc
          println(fragmentName) //prints do something
          ok
        }
    
        "do something else" in {
          val fragmentName = is.examples(1).desc
          println(fragmentName) //prints do something else
          ok
        }
      }
    }
    

    【讨论】:

    • 不错。因为它是 Scala,所以必须有一种方法来消除样板。有什么想法吗?
    • 其实,我只是尝试了第一个,它不适合我。
    • 第一种方法肯定行得通。您使用的是哪个 specs2 版本?究竟什么是“不工作”?
    • 关于第二种方法的一些说明。 filter(_.isInstanceOf...).map(_.asInstanceOf...) 最好编码为 collect { case e: Example => e }。然后,有一个examples 方法可以做到这一点,所以你可以写is.examples。最后,如果使用is,出于性能原因,最好将此值存储在 val 中。
    • @Eric 我更新了示例,但省略了任何性能调整,感谢您的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2013-01-27
    • 2011-04-05
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    相关资源
    最近更新 更多