以下の複雑な期待を共有する RSpec の例がいくつかあります。これらの例では、配列records
と浮動小数点数min_long
, max_long
,min_lat
がmax_lat
異なります。
expect(records).to all have_attributes(
shape: have_attributes(
exterior_ring: have_attributes(
points: all(
have_attributes(
longitude: be_between(min_long, max_long),
latitude: be_between(min_lat, max_lat)
)
)
)
)
)
(期待値は、それぞれのテストが生成したすべてのレコードが、テスト固有の境界ボックスに完全に含まれる形状 (私の場合はRGeo Polygon ) を持っているかどうかをチェックします。)
繰り返しを減らし、名前をつけて複雑な期待の意図をより明確にするために、それをメソッドに抽出しました。
def expect_in_bbox(records, min_long, max_long, min_lat, max_lat)
expect(records).to all have_attributes(
shape: have_attributes(
exterior_ring: have_attributes(
points: all(
have_attributes(
longitude: be_between(min_long, max_long),
latitude: be_between(min_lat, max_lat)
)
)
)
)
)
end
これは正常に動作しますが、今ではそのメソッドを呼び出す必要があります。
expect_in_bbox(valid_records, 12.55744, 12.80270, 51.36250, 51.63187)
私の例では。
これは、RSpec の仕様 DSL では異質に見えます。書ける方がいいです
expect(valid_records).to be_in_bbox(12.55744, 12.80270, 51.36250, 51.63187)
また
expect(valid_records).to all be_in_bbox(12.55744, 12.80270, 51.36250, 51.63187)
代わりは。
これを達成するための推奨される方法はありますか?
RSpec のマッチャー エイリアシング機能は、マッチャー名を他のマッチャー 名にマップするだけで、引数を使用した完全なマッチャー呼び出しではないように見えるため、これには使用できないと思い ます。とはいえ、おそらく のoptions
引数はalias_matcher
そのためのものでしょうか?
もちろん、カスタム マッチャーを実装することもできますが、その場合、既存のマッチャーで構成されていることと矛盾するブール値を返す実装を提供する必要があるでしょう。all
(難しいというわけではありませんが、や などを使った実装が好きbe_between
です。)
最後に、要素のクラスにモンキー パッチを適用して属性valid_records
を持たせin_bbox?(min_long, max_long, min_lat, max_lat)
、RSpec が対応するbe_in_bbox(min_long, max_long, min_lat, max_lat)
マッチャーを自動的に提供するようにすることもできます。