Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

ScalaTestでMapの存在判定をする

一瞬ハマったのでメモ。

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 keyshould 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))

シェイクスピアみたいなテストのできあがり。

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?