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)
Niestety, przegapiłem twoją odpowiedź, kiedy to zrobiłeś, ale dzięki! –
np. Dziękuję za moją pierwszą zaakceptowaną odpowiedź! – jazmit
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