在 Cucumber 测试中,一个特征表示为 Given
, When
和 Then
通常被实现为三个独立的方法。这些方法通常需要共享值,而这似乎是可变变量的方法。
举个简单的例子:
一项功能:
Given the digit 2
When it is multiplied by 3
Then the result is 6
和 cucumber 方法:
class CucumberRunner extends ScalaDsl with EN with ShouldMatchers {
var digitUnderTest: Int = -1
Given("""^the digit (\d)$""") { digit: Int =>
digitUnderTest = digit
}
When("""^it is multiplied by 3$""") {
digitUnderTest = digitUnderTest * 3
}
Then("""^the result is (\d)$""") { result: Int =>
digitUnderTest should equal (result)
}
}
有什么办法,大概是内置在 Scala 测试或 Cucumber-jvm 中的 Scala,让我不表达
digitUnderTest
作为可变变量?
最佳答案
看着 cucumber-jvm
java 中的示例和 scala ,我怀疑它提供了一种方法来逐步传递数据,而无需将其临时存储在变量中。
由于您无法重新分配 val
在scala中,我能想到的最接近你摆脱可变的东西var
是有一个保存临时测试数据的全局 map 。
class CucumberRunner extends ScalaDsl with EN with ShouldMatchers {
Given("""^the digit (\d)$""") { digit: Int =>
GlobalTestData.save("my_unique_key_1", digit)
}
When("""^it is multiplied by 3$""") {
GlobalTestData.load("my_unique_key_1") match {
case Some(obj) => {
val result = obj.asInstanceOf[Int] * 3
GlobalTestData.save("my_unique_key_2", result)
}
case None => // throw exception or fail test
}
}
Then("""^the result is (\d)$""") { result: Int =>
GlobalTestData.load("my_unique_key_2") match {
case Some(obj) => obj.asInstanceOf[Int] should equal (result)
case None => // throw exception or fail test
}
}
}
然后是
GlobalTestData
:object GlobalTestData {
val map = scala.collection.mutable.Map.empty[String, Any];
def save(key: String, value: Any) {
map.put(key, value)
}
def load(key: String): Option[Any] = map.get(key)
}
在这种情况下,您需要小心地生成 key ,以使它们在各个步骤中都相同。当然,你可以用一些
val
s 来保存这些键的值。同样在这个特殊功能中,为什么不结合
Given
和 When
脚步:When the digit 2 is multiplied by 3
Then the result is 6
这样你就可以在
GlobalTestData
中保存一个插槽.
关于scala - 是否可以使用 Cucumber-jvm Scala 避免可变状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14405345/