4

1 つの 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)

エリックはこのコメントで「古典的な」型推論の問題を参照していますが、答えが見つかりませんでした。

4

1 に答える 1

4

問題は次の行にあります。

issue must not beNull

演算子表記で記述されているため、コンパイラは正しい位置にあるドットと括弧を推測する必要があります。obj meth argこの行と同じルールに従うと、次のようobj.meth(arg)に解釈されます。

issue.must(not).beNull<missing_arg>

beNullの戻り値で呼び出されるメンバーですissue.must(not)。コンパイラは、演算子表記の規則に従い、それを として扱いmethながら、issue.must(not)として扱いますobj。演算子表記法では常に呼び出しが の形式である必要があるためobj meth arg、上記の例では、無効な構文のためにコンパイラがエラーをスローすることを保留しています。しかし、さらに 2 つのルールがあるため、それは行われません。

  1. 演算子表記で識別子を区切る空白には、スペースまたはタブだけでなく、1 つの (!) 改行記号を含めることもできます。
  2. 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 では、この質問でわかるように、トリッキーな動作につながる可能性があるため、警告を扱います。

于 2013-01-15T13:09:49.370 に答える