1

テーブルの単純な挿入および更新テストがあります。

    case class Player(id: UUID, name: String, email: String)

挿入と検索を実行するためのモデル オブジェクトのすべての適切な設定を使用します。

次のテストを実行します。

class PlayerSpec extends Specification {
  "Player" should {

    val application = FakeApplication(additionalConfiguration =  inMemoryDatabase("test"))

    "insert a player" in {
      running(application) {

        val uuid = UUID.randomUUID()

        Player.insert(Player(uuid, "Joe Person", "joe.player@someplace.mail")) must beEqualTo(1)
      }
    }

    "Find a player by id" in {
      running(application) {
        val uuid = UUID.randomUUID()

        Player.insert(Player(uuid, "Jane Person", "jane.player@someplace.mail"))

        Player.findById(uuid) must beEqualTo(Some(Player(uuid, "Jane Person", "jane.player@someplace.mail")))
      }
    }

  }
}

Intellij で緑色のバーが表示されます (両方の例がパスします)。ただし、これをプレイコンソールで実行すると、次のエラーが発生します。

[info] PlayerSpec
[info] 
[info] Player should
[info] + insert a player
[error] ! Find a player by id
[error]     anon$1: Configuration error [Cannot connect to database [default]] Configuration.scala:258)
 ....

これは構成の問題ですか、それとも beforeEach 型の呼び出しが欠落していますか?

編集

より多くの参照のために、dbコードを追加するだけです

case class Player(id: UUID, name: String, email: String)

object Player {

  private val fullPlayer = {
    get[UUID]("player.id")(Utils.rowToUuid) ~
    get[String]("player.name") ~
    get[String]("player.email") map {
      case id~name~email => Player(id, name, email)
    }
  }

  def insert(player: Player) = {
    DB.withConnection { implicit c =>

      SQL(
        """
          insert into player (id, name, email) values (
             {id}, {name}, {email}
          )
        """
      ).on(
        'id -> player.id.toString,
        'name -> player.name,
        'email -> player.email
      ).executeUpdate()

    }
  }

  def findById(id: UUID) : Option[Player] = {
    DB.withConnection { implicit c =>
      SQL("select * from player where id = {id}").on('id -> id).as(fullPlayer.singleOpt)
    }
  }
}

行から UUID:

object Utils {
  implicit def rowToUuid: Column[UUID] = Column.nonNull {
    (value, meta) =>
      val MetaDataItem(qualified, nullable, clazz) = meta
      value match {
        case uuid: UUID => Right(uuid)
        case _ => Left(TypeDoesNotMatch("Cannot convert " + value + ":" + value.asInstanceOf[AnyRef].getClass + " to UUID for column " + qualified))
      }
  }
}
4

1 に答える 1

1

FakeApplicationを複数のテストに再利用しないでください。

変更するだけ

 val application = FakeApplication(additionalConfiguration =  inMemoryDatabase("test"))

def application() = FakeApplication(additionalConfiguration =  inMemoryDatabase("test"))

アプリケーションを呼び出すたびに新しいFakeApplicationを作成します。この関数をかっこで呼び出すのが良いスタイルです。

于 2012-10-04T18:29:19.733 に答える