2

Play2 アプリで db 統合テストを作成する方法を見つけようとしています。

私の conf ファイルでは、通常使用する xxx_test とテスト用の h2 db の 2 つのデータベースを指定しました。

db.xxx_test.driver=com.mysql.jdbc.Driver
db.xxx_test.url="jdbc:mysql://localhost/xxx_test?characterEncoding=UTF-8"
db.xxx_test.user="root"
db.xxx_test.password=""

db.h2.driver=org.h2.Driver
db.h2.url="jdbc:h2:mem:play"
db.h2.user=sa
db.h2.password=""

User オブジェクトxxx_testで、アプリケーションの実行時に使用するように指定しました。

def createUser(user: User): Option[User] = {

    DB.withConnection("xxx_test") {
      implicit connection =>
        SQL("insert into users(first_name, last_name, email, email_validated, last_login, created, modified, active) values({first_name},{last_name},{email},{email_validated},{last_login}, {created}, {modified}, {active})").on(
          'first_name -> user.firstName,
          'last_name -> user.lastName,
          'email -> user.email,
          'email_validated -> user.emailValidated,
          'last_login -> user.lastLogin,
          'created -> user.created,
          'modified -> user.modified,
          'active -> true
        ).executeInsert().map(id => {
          return Some(User(new Id[Long](id), user.firstName, user.lastName, user.email, user.emailValidated, user.lastLogin, user.created, user.modified, true))
        }
        )
    }
    None
  }

私のテストでは、新しい inMemoryDatabase を作成し、ユーザーを使用してテスト用のオブジェクトを作成および取得します。

class DBEvolutionsTest extends Specification {

  "The Database" should {
    "persist data properly" in {
      running(FakeApplication(additionalConfiguration = inMemoryDatabase())) {

        User.create(User(Id[Long](1L), "jakob",
          "aa",
          "aaa",
          true,
          DateTime.now(),
          DateTime.now(),
          DateTime.now(),
          true)) 

        val newUser = User.findBy(Id[Long](1L))

        newUser.get.firstName must beEqualTo("jakob")
      }
      }
    }

}

User オブジェクトはデータベースxxx_testではなく を使用するため、これはもちろん正しい方法ではありません。User( ) オブジェクトh2で db を指定したため、テストではメモリ内ではなく実際の db にユーザーが作成されます。DB.withConnection("xxx_test")これを行うスマートな方法があると思います。アプリケーションのようにデータベース名を渡したくありませんUser.create(User(...), "xxx_test")

この問題をどのように解決しましたか?

4

3 に答える 3

0

メソッドは次のinMemoryDatabaseように定義されます。

def inMemoryDatabase(
  name: String = "default", 
  options: Map[String, String] = Map.empty[String, String]): Map[String, String]

私の推測ではxxx_test、パラメータとしてを渡す必要がありnameます。

于 2013-03-19T23:33:52.553 に答える
0

インメモリ データベースには、デフォルト (xxx_test) 以外の名前を定義する必要があります。次のスニペットが機能するはずだと思います。

FakeApplication(additionalConfiguration = inMemoryDatabase("h2"))

こちらもご覧ください: https://stackoverflow.com/a/11029324/2153190

于 2013-03-20T10:13:43.933 に答える