一瞬ハマったのでメモ。
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))
シェイクスピアみたいなテストのできあがり。