玩框架specs2奇怪的匹配器语法

时间:2016-01-27 17:28:29

标签: scala specs2

在Play框架specs2测试中,我有这些线......

    new WithApplication {
      val homeResponse = route(FakeRequest(GET, "/")).get
      val resultType = contentType(homeResponse)
      resultType.must( beSome.which( _ == "text/html") )
    }

^这是有效的,但当我拉" beSome.which(_ ==" text / html")"变成一个单独的变量......

    new WithApplication {
      val homeResponse = route(FakeRequest(GET, "/")).get
      val resultType = contentType(homeResponse)
      val textTypeMatcher = beSome.which( _ == "text/html")
      resultType.must( textTypeMatcher )
    }

^类型不匹配。

预期:匹配[Option [String]],实际:OptionLikeCheckedMatcher [Option,Nothing,Nothing] ^

这里发生了什么?

1 个答案:

答案 0 :(得分:3)

在第一种情况下,它会根据resultType.must(推断出类型,因为resultType是String。但是当你分开它时,没有什么可以推断的,所以你会得到:

val textTypeMatcher = beSome.which( _ == "text/html")
=> OptionLikeCheckedMatcher[Option, Nothing, Nothing]

但如果您添加类型:beSome[String],则会再次获得正确的类型。

val textTypeMatcher = beSome[String].which( _ == "text/html")
=> OptionLikeCheckedMatcher[Option, String, String]

编辑:

你也可以这样做:

val textTypeMatcher: OptionLikeCheckedMatcher[Option, String, String] = beSome.which( _ == "text/html")

所以基本上,如果你给类型推断器一些东西,它会推断出_必须是一个字符串。否则,Scala无法知道_应该是一个字符串。