一瞬ハマったのでメモ。
val m: Map[DateTime, Int] = ...
このような、DateTimeからIntへのMapがあるとする。
ScalaTestで、ある範囲の日付がすべてこのMapにキーとして含まれていることを知りたい。
誤答: definedAtを使う
val from = DateTime.parse("2023-03-01T00:00:00+09:00") val until = DateTime.parse("2023-04-01T00:00:00+09:00") val datetime = (0 until 31).map(from.plusDays) forAll(datetime) { case (dt) => withClue(s"at $dt") { m shouldBe definedAt(dt) } }
これだと実行時エラーになる。
正答: should contain key を使う
should contain keyやshould contain valueが用意されているので、これを使う。
val from = DateTime.parse("2023-03-01T00:00:00+09:00") val until = DateTime.parse("2023-04-01T00:00:00+09:00") val datetime = (0 until 31).map(from.plusDays) forAll(datetime) { case (dt) => withClue(s"at $dt") { m should contain key dt } }
definedAtの用法
そもそもdefinedAtはどういうときに使うかというと、Listといったコレクションに対して使うものらしい。引数としてインデックスを取るようだ。だったらMapでも動いてほしいような気がするのだが・・・。
val xs = List(1,2,3,4,5) xs should (be definedAt(4) and not be definedAt(5))
シェイクスピアみたいなテストのできあがり。