加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

unit-testing – specs2:多个匹配器表达式(单位规范)

发布时间:2020-12-16 10:02:41 所属栏目:安全 来源:网络整理
导读:如何在一个Matcher片段中检查多个表达式? 例如: class Foo extends Specification { "Retrieving open issues" should { "return expected properties with expected data" in { val issue = Bar.openIssues.head issue must not beNull issue.number must
如何在一个Matcher片段中检查多个表达式?

例如:

class Foo extends Specification {
   "Retrieving open issues" should {
      "return expected properties with expected data" in     {
         val issue = Bar.openIssues.head

         issue must not beNull
         issue.number must beEqualTo(1) 
         issue.state must beEqualTo("open")
         issue.title must beEqualTo("first issue")
      }
   }
}

给出错误

[error]  type mismatch;
[error]  found   : Int
[error]  required: org.specs2.matcher.Matcher[Issue]
[error]                         issue.number must beEqualTo(1)

Eric在this comment中引用了“经典”类型推断问题,但未找到答案.

解决方法

问题出在这一行:

issue must not beNull

因为它是用运算符表示法编写的,所以编译器必须在正确的位置推断出点和圆括号.遵循obj meth arg与obj.meth(arg)相同的规则,该行被解释为:

issue.must(not).beNull<missing_arg>

beNull是在issue.must(not)的返回值上调用的成员.编译器遵循运算符表示法的规则,并在发出问题时将其视为meth.必须将(not)视为obj.因为运算符表示总是要求调用必须具有obj meth arg形式,所以在上面的示例中,编译器因为语法无效而保持抛出错误.但它没有这样做,因为还有两个规则:

>以运算符表示法分隔标识符的空格不仅必须包含空格或制表符,还必须包含单个(!)新行号.
>如果找不到arg,则隐式插入空参数列表.

由于(1),编译器将下一行视为arg:

issue.must(not).beNull(
issue.number).must(beEqualTo(1))

这不是代码应该如何解释.要解决这个问题,可以将整个表达式括在括号中:

(issue must not beNull)

或者用空行分隔这些行:

issue must not beNull

issue.number must beEqualTo(1)

两种解决方案都有效,因为(2)编译器可以插入一个空参数列表.

注意:如果必须应用(2),这也称为后缀运算符.在2.10中,他们会对警告进行处理,因为 – 正如人们可以看到的那样 – 他们可能会导致棘手的行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读