6

これはPlay用です!フレームワーク2.0。

ユーザーモデルが正しく機能し、データベースにデータを保持していることを確認するために、簡単なテストケースを作成しようとしています。可能であればメモリ内で実行したいので、新しい実行のたびに新たなスタートを切ることができます。

私が抱えている問題は、進化が実行されることです(テーブルが作成され、データが挿入されますが、そこにあるものとしてクエリすることはできません)。まず、私のコード。

CREATE TABLE user_data (
id SERIAL PRIMARY KEY,
user_name varchar(256) UNIQUE NOT NULL,
email varchar(256) NOT NULL,
password varchar(256) NOT NULL,
edits int NOT NULL,
reports int NOT NULL,
active BOOLEAN NOT NULL);

INSERT INTO user_data(user_name, email, password, edits, reports, active) VALUES ('user1', 'user1@email.com', '12345678', 0, 0, true);

application.conf内

db.default.driver=org.postgresql.Driver
db.default.url="postgres://user:password@localhost:5432/ME"

build.scalaで

val appDependencies = Seq(
  // Add your project dependencies here,
    "postgresql" % "postgresql" % "9.1-901-1.jdbc4"
)

テストコード

class User_dataSpec extends Specification {

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

      //User_data.findAll().length must beEqualTo(1)
      //Create users
      User_data.create("user1", "password1", "email@test1.com") must beEqualTo(1)
      User_data.create("user2", "password2", "email@test2.com") must beEqualTo(2)
      User_data.create("user1", "password3", "email@test3.com") must beEqualTo(0)

      //Count users
      User_data.findAll().length must beEqualTo(2)

      //Verify users exist
      User_data.exists("user1") must beTrue
      User_data.exists("user2") must beTrue

      //Verify user doesn't exist
      User_data.exists("user3") must beFalse

      //Find users by ID
      User_data.findUser(1).get.user_name must beEqualTo("user1")
      User_data.findUser(2).get.user_name must beEqualTo("user2")

      //Fail to find users by ID
      User_data.findUser(3) must beNone

      //Find users by user_name
      User_data.findUser("user1").get.user_name must beEqualTo("user1")
      User_data.findUser("user2").get.user_name must beEqualTo("user2")

      //Fail to find users by user_name
      User_data.findUser("user3") must beNone

      //Authenticate users
      User_data.authenticate("user1", "password1") must beTrue
      User_data.authenticate("user2", "password2") must beTrue

      //Fail to authenticate users
      User_data.authenticate("user1", "password2") must beFalse
      User_data.authenticate("user3", "passwordX") must beFalse

      //Confirm the user was inserted properly
      val user = User_data.findUser("user1")
      user.get.user_name must beEqualTo("user1")
      user.get.email must beEqualTo("email@test1.com")
      user.get.password must beEqualTo("password1")
      user.get.edits must beEqualTo(0)
      user.get.reports must beEqualTo(0)
      user.get.active must beTrue
      }
    }
  }
}

このコードは記述どおりに渡されますが、渡されるべきではありません。実行中のブロック内の最初のテストケースのコメントを外して、findAll()関数の長さが1であることをテストすると、すぐに失敗します。ただし、これを変更してマシンで永続化されたPostgreSQL DBを使用すると、すぐに失敗しますが、PostgreSQL DBを見ると、user_dataテーブルには単一のevolutionが適用された挿入があり、play_evolutionsテーブルにはエントリがあります私の進化のために、state="applied"およびlastproblem=""としてマークされています。

助けていただければ幸いです、ありがとう。

(PS、私は初めてのポスターですが、助けてくれる人のためにできるだけ早く答えを受け入れるように最善を尽くします)

4

3 に答える 3

3

* 更新しました *

Jakobが述べたように、進化が失敗する理由は、おそらくMySQL用に記述されたSQLがH2DBと互換性がないためです。これを解決するには、元の回答に従ってテスト用に別のMySQLを使用するか、H2DBをMySQL互換モードにして、問題を修正することができます(ScalaのFixtures in Play!2を参照)。

于 2012-06-14T08:27:13.677 に答える
0

EvolutionsとH2の問題は、H2がpostgresやMySQLなどで実行できるすべての機能に準拠していないことです。したがって、進化は本番環境では正常に実行されますが、テストでは失敗します。私はプロジェクトでこの問題を抱えていましたが、最終的には、進化を使用せず、代わりにDB用にliquibaseを使用することで解決しました。

または、作成したSQLがH2で実行できることを確認する必要があります。その場合、進化はうまく機能します。H2の問題が何であったかを正確に覚えていません(私が思うインデックスについての何か)

于 2013-01-25T09:02:33.690 に答える
0

これはPlayFramework2.0のバグだと思います

https://play.lighthouseapp.com/projects/82401/tickets/295-20test-testhelpers-method-evolutionfor-do-wrong-if-fakeapplication-with-inmemroydatabase

于 2013-01-24T22:48:04.463 に答える