如何测试`Some [String]`是否包含其他字符串?

时间:2014-07-08 06:36:49

标签: scala matcher specs2

假设我的值为Some("aaabbbccc"),我想测试Some中的值是否包含其他字符串。

我试过了:

val myvalue = Some("aaabbbccc")
myvalue must beSome(contain("bbb"))

它无法编译,但我找不到工作的。

如何写这样的断言?

3 个答案:

答案 0 :(得分:1)

你可能会遇到这种情况

None must be none
Some("foo") must beSome(contain("f"))

这两个语句不会编译。

编译器会抱怨

method apply in trait MatchResult cannot be accessed in org.specs2.matcher.MatchResult[Option[T]]
[error]       None must be none
[error]

                ^

只需在第一个语句的末尾添加一个;,一切都会好起来

答案 1 :(得分:0)

您可以尝试使用以下自定义匹配器,直接从文档中获取:http://www.scalatest.org/user_guide/matchers_quick_reference

val beOdd =
  Matcher { (left: Int) =>
    MatchResult(
      left % 2 == 1,
      left + " was not odd",
      left + " was odd"
    )
  }

3 should beOdd

那说......或许有一种很好的scala表达你所追求的东西。

我刚刚看到字符串包含matcher,但是如何使用Option [String] ..?

string should include ("seven")

好的..得到了它:

option.value should be < 7

在你的情况下会是:

myvalue should be ('defined)
myvalue.value should include ("bbb")

答案 2 :(得分:0)

scala> val myvalue = Some("aaabbbccc")
myvalue: Some[String] = Some(aaabbbccc)

scala> myvalue exists (_.contains("bbb"))
res0: Boolean = true

scala> myvalue exists (_.contains("abc"))    
res1: Boolean = false

您可以轻松地将其调整为specs2:

(myvalue exists (_.contains("bbb"))) must beTrue 

真正的选择是在myValue碰巧为无的情况下,您希望测试如何做出反应。如果您希望它在None上失败,请使用上面的内容。如果您希望它成功,请改用:

(myValue forall (_.contains("bbb"))) must beTrue

在这两种情况下,它都会在Some上进行您想要的测试。