Witam,
Mam problem z testami w Railsach.
Stworzyłem dwa modele: Client i Account
Modele są połączone między sobą.
Account w database posiada rekord client_id ( not null).
Mój problem jest następujący: kiedy robię testy z modelem Client bez tworzenia kont z Account, zawsze mam ten błąd:
ClientTest#test_to_s:
ActiveRecord::StatementInvalid: SQLite3::ConstraintException: NOT NULL constraint failed: accounts.client_id: INSERT INTO “accounts” (“client_id”, “number”, “balance”, “created_at”, “updated_at”, “id”) VALUES (NULL, 1, 1, ‘2015-01-05 15:16:34’, ‘2015-01-05 15:16:34’, 980190962).
Zauważyłem, że Rails podczas tworzenia nowego klienta automatycznie tworzą puste konto.
Czy można to wyłączyć ?
Tutaj kod modeli: https://ideone.com/WsS7o2
Dodatkowo mam tylko modele, nie tworzyłem żadnych controllerów, czy innych klas, czy metod…
Wincyj kodu!
A jeśli nie chcesz żeby Ci się kod wywracał na constraint’cie w bazie danych (nie chcesz) to dodaj do Account validates :client, presence: true
Witam,
dodaję kod testów https://ideone.com/UV0YS4 … Testy Clienta działały dopóki nie dodałem modelu Account… dziwne jest że przy tworzeniu w teście obiektu klienta on na silę dodaje puste konto
Nie mam pojęcia na jakiej bazie odpalasz te testy (masz od tego bazę testową czy lecą na developmencie?). Po cichutku zakładam, że na teście, spróbuj odpalić
Dobra, biorąc pod uwagę wartości z tego błędu i to co masz w fixtures i w test_helper, na Twoim miejscu wyrzuciłbym od razu fixtures :all z test_helpera, najlepiej wyrzuć wszystkie fixtures. Po tym Ci zadziała. Ze swojej strony polecam jak najszybciej zacząć pisać testy w rspecu
Dzięki Wielki !, Dopiero co zacząłem zabawę z Railsami i takie błędy ;p na razie próbuję ogarnąć podstawy … wszystko działa jeszcze raz dzięki… i spróbuję te respeci używać
Z czystej ciekawości - dlaczego w RSpec’u? Zgodnie z moją wiedzą (głównie Reddit, fora) wiele osób przechodzi na MiniTest (łatwiejszy dla początkującego, szybsze testy).
Rozumiem, że RSpec głównie dla tego, że już jest wykorzystywany przez dany team?