2012-05-25 7 views
6

To jest dla zabawy! Framework 2.0.Używanie specyfikacji specs2 i FakeApplication() do testowania bazy danych kończy się niepowodzeniem Wkładki ewolucyjne

Próbuję napisać prosty przypadek testowy, aby upewnić się, że mój model użytkownika działa poprawnie i że dane są przechowywane w bazie danych. Chciałbym go uruchomić w pamięci, jeśli to możliwe, aby móc zacząć od nowa z każdym kolejnym biegiem.

Problem w tym, że moje ewolucje działają (tabele są tworzone, dane są wstawiane, ale nie mogę o to zapytać). Po pierwsze, mój kod.

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', '[email protected]', '12345678', 0, 0, true); 

W application.conf

db.default.driver=org.postgresql.Driver 
db.default.url="postgres://user:[email protected]:5432/ME" 

W build.scala

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

Kod testu

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 protected]") must beEqualTo(1) 
     User_data.create("user2", "password2", "[email protected]") must beEqualTo(2) 
     User_data.create("user1", "password3", "[email protected]") 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 protected]") 
     user.get.password must beEqualTo("password1") 
     user.get.edits must beEqualTo(0) 
     user.get.reports must beEqualTo(0) 
     user.get.active must beTrue 
     } 
    } 
    } 
} 

Kod ten minie jak napisane, jednak powinnaś t. Jeśli odkomentuję pierwszy przypadek testowy wewnątrz działającego bloku, aby przetestować, że funkcja findAll() powinna mieć długość 1, natychmiast zawiedzie. Jednakże, jeśli zmienię to, aby używał utrzymywanego PostgreSQL DB na moim komputerze, nadal będzie on działał natychmiast, ale kiedy patrzę na PostgreSQL DB, moja tabela user_data ma wstawioną pojedynczą ewolucję wstawianą, a tabela play_evolutions ma wejście dla mojej ewolucji i jest oznaczony jako stan = "zastosowany" i ostatni problem = "".

Każda pomoc będzie doceniona, dzięki.

(PS, jestem po raz pierwszy plakat, ale zrobi mój najlepszy zaakceptować odpowiedź tak szybko, jak to możliwe dla tych, którzy chcą pożyczać ich pomocy)

Odpowiedz

3

* AKTUALIZACJA *

Jak Jakob stwierdzono, że przyczyną niepowodzenia jest prawdopodobnie to, że SQL napisany dla MySQL jest niezgodny z H2DB. Możesz rozwiązać ten problem, używając oddzielnego MySQL do testowania zgodnie z oryginalną odpowiedzią lub umieścić H2DB w trybie zgodności z MySQL, co może rozwiązać problem (patrz Fixtures in Play! 2 for Scala).

+0

Niestety, przegapiłem twoją odpowiedź, kiedy to zrobiłeś, ale dzięki! –

+0

np. Dziękuję za moją pierwszą zaakceptowaną odpowiedź! – jazmit

+0

To nie ma żadnego sensu. Jeśli określisz inną nazwę dla bazy danych w pamięci, żądania połączeń powinny również zostać rozszerzone o tę nazwę. Ponadto będziesz potrzebował wpisu db.test w swojej konfiguracji. Jeśli nie podejmiesz tych kroków, po prostu użyjesz "domyślnej" bazy danych. Może coś przeoczyłem. – EECOLOR

0
+0

Todd, Nie korzystam obecnie z Play, ponieważ miałem zbyt wiele błędów i/lub nieudokumentowanych zachowań dla szybkiego projektu, nad którym pracowałem. Nie jestem pewien, czy mogę przekazać ci pytanie, czy pozwolić ci wybrać właściwą, zaakceptowaną odpowiedź, ale z przyjemnością pozwolę ci przejąć to pytanie w jakiś sposób, jeśli uważasz, że moja zaakceptowana odpowiedź nie jest już dokładna. –

+0

Dzięki, William Thurston. Myślałem o opublikowaniu nowego pytania, ale najpierw chcę wypróbować to na najnowszym kandydacie do wydania dla gry 2.1. –

+0

... Nadal nie uaktualniłem gry do wersji 2.1. To nie jest trywialna migracja, a zaległości są bardziej naglące. –

0

Problem z ewolucji i H2 H2 jest, że nie jest zgodny ze wszystkiego można zrobić z PostgreSQL lub MySQL na przykład. Więc ewolucje przebiegną dobrze, ale nie zdadzą testu. Miałem ten problem w projekcie i ostatecznie rozwiązałem go, po prostu nie wykorzystując ewolucji i zamiast tego używam liquidibase dla rzeczy DB.

Albo trzeba się upewnić, że zapisany sql można uruchomić w H2. W takim przypadku ewolucje będą działały dobrze. Nie pamiętam dokładnie, jaki był problem z H2 (coś o indeksach myślę)

Powiązane problemy