0

Specs2 のドキュメントとサンプルには、受け入れテストでの Give/Then/When スタイルの使用に関するコードがいくつか示されています。

ここにそれらの1つ:

"A given-when-then example for the addition"                   ^
    "Given the following number: ${1}"                         ^ number1 ^
    "And a second number: ${2}"                                ^ number2 ^
    "And a third number: ${3}"                                 ^ number3

  val number1: Given[Int]               = (_:String).toInt
  val number2: When[Int, (Int, Int)]    = (n1: Int) => (s: String) => (n1, s.toInt)
  val number3: When[Seq[Int], Seq[Int]] = (numbers: Seq[Int]) => (s: String) => numbers :+ s.toInt

ただし、ここでは一部のプリミティブ オブジェクトのみを扱いIntます (サンプルなので通常)。

しかし、複雑なオブジェクトをどのように扱うのでしょうか? を使用していDatatablesますか?

理想的なのは、「フィクスチャ」のファイル内で、複雑なオブジェクトを定義するデータテーブル (または同様のもの) を定義することです。

User「Mik」を定義する外部データテーブル

"name" |   "job"    | "e-mail"
"mik"  | "engineer" | "mik@mik.com"

次のような Given ステートメントを作成したいと思います。

"Given the following user: ${Mik}"       ^ retrieve_user_from_database ^

val user: Given[User]               = .....Some ideal codes here to map Mik's values to User model.

良いプラクティスとは何ですか? Specs2 は現在何を提供していますか?

4

1 に答える 1

1

既存のデータベースからユーザーを取得する場合は、次の操作を実行できます。

"Given the following user: ${Mik}" ^ user ^

val user: Given[User] = (name: String) => database.getUserByName(name) 

それを行う前に、データベースにユーザーを入力することをお勧めします。1 つの可能性は、実際に Datatables を使用することです。

def populateDatabase = 
  "name" ||   "job"    | "e-mail"        |
  "mik"  !! "engineer" ! "mik@mik.com"   |
  "eric" !! "engineer" ! "eric@eric.com" | { (name, job, email) => 
    database.saveUser(User(name, job, email)) must not(throwAn[Exception])
  }

StepこれをG/W/T グループの前に置きます:

Step(populateDatabase) ^
"Given the following user: ${Mik}"  ^ user ^
"This user should be an ${engineer} ^ jobOk ^
                                      end

val user: Given[User] = (name: String) => database.getUserByName(name)
val jobOk: Then[User] = (user: User) => (job: String) => user.job must_== job
于 2013-01-24T23:03:19.470 に答える