2017-06-07 29 views
9

Po utworzeniu nowego pliku migracji, uruchamiając migracji, a następnie uruchomiony moich testów otrzymuję:Dlaczego muszę migrować testową bazę danych w Railsach?

Failure/Error: ActiveRecord::Migration.maintain_test_schema! 

ActiveRecord::PendingMigrationError: 

    Migrations are pending. To resolve this issue, run: 

      bin/rails db:migrate RAILS_ENV=test 

nie jest następujący fragment w rails_helper.rb powinien zastosować migracje do bazy testowej dla mnie?

# Checks for pending migration and applies them before tests are run. 
# If you are not using ActiveRecord, you can remove this line. 
ActiveRecord::Migration.maintain_test_schema! 

Aktualizacja

Oto moja config/environments/test.rb na żądanie:

Rails.application.configure do 
    # Settings specified here will take precedence over those in config/application.rb. 

    # The test environment is used exclusively to run your application's 
    # test suite. You never need to work with it otherwise. Remember that 
    # your test database is "scratch space" for the test suite and is wiped 
    # and recreated between test runs. Don't rely on the data there! 
    config.cache_classes = true 

    # Do not eager load code on boot. This avoids loading your whole application 
    # just for the purpose of running a single test. If you are using a tool that 
    # preloads Rails for running tests, you may have to set it to true. 
    config.eager_load = false 

    # Configure public file server for tests with Cache-Control for performance. 
    config.public_file_server.enabled = true 
    config.public_file_server.headers = { 
    'Cache-Control' => 'public, max-age=3600' 
    } 

    # Show full error reports and disable caching. 
    config.consider_all_requests_local  = true 
    config.action_controller.perform_caching = false 

    # Raise exceptions instead of rendering exception templates. 
    config.action_dispatch.show_exceptions = false 

    # Disable request forgery protection in test environment. 
    config.action_controller.allow_forgery_protection = false 
    config.action_mailer.perform_caching = false 

    # Tell Action Mailer not to deliver emails to the real world. 
    # The :test delivery method accumulates sent emails in the 
    # ActionMailer::Base.deliveries array. 
    config.action_mailer.delivery_method = :test 

    # Print deprecation notices to the stderr. 
    config.active_support.deprecation = :stderr 

    # Raises error for missing translations 
    # config.action_view.raise_on_missing_translations = true 
end 
+0

Czy masz szansę używać sqlite? – jvillian

+0

Nawet nie wspomniałem o tym, że tak naprawdę używam PostgreSQL. – ardavis

+0

jaka jest twoja wersja Rails? – Thanh

Odpowiedz

1

na prowadzeniu badań konfiguracje są ładowane w następującej kolejności (chyba, że ​​dostosowano kolejność ścieżek autoloadowania w aplikacji szyny):

  1. config/environment.rb
  2. config/środowiska/test.rb
  3. Spec/rails_helper.rb

więc migracja oczekiwaniu błąd otrzymujesz musi być spowodowane config.active_record.migration_error = true Taka konfiguracja konfiguracja gdzieś wcześniej na silniku szyn ładuje się rails_helper.rb, gdzie zdefiniowano dyrektywę ActiveRecord::Migration.maintain_test_schema!.

Spróbuj ustawić config.active_record.migration_error = false na swoim config/environments/test.rb, aby pominąć sprawdzanie migracji.

+0

Nie miałem okazji sprawdzić, czy twoje rozwiązanie działa, ale jeśli tak, czy należy dodać tę linię do generatora instalacji RSpec? – ardavis

+0

nr .. 'config/environments/test.rb' – sa77

+0

Niestety, nie było jasne. Wiem, że linia powinna przejść do test.rb. Najwyraźniej domyślnie jest to prawda. Jeśli domyślny "spec_helper" RSpec dodaje wiersz "ActiveRecord :: Migration.maintain_test_schema!", Wydaje się, że robi absolutnie nic, chyba że 'config.active_record.migration_error' ma wartość false. Wydaje się, że idą w parze, nie? – ardavis

-4

Należy uruchomić rails db:migrate RAILS_ENV=test najpierw zaktualizować testu DB.

Co to oznacza, zamiast prowokować, gdy schemat testu oczekuje na migracje, Railsy spróbują załadować schemat. Wyjątek zostanie teraz podniesiony tylko wtedy, gdy są oczekujące migracje po załadowaniu schematu.

Istnieje kilka zastrzeżenia do być świadomy podczas korzystania z tego:

  • Migracje wciąż muszą być uruchamiane ręcznie; chociaż teraz należy to zrobić tylko w środowisku "rozwoju".
  • Wyjątek zostanie zgłoszony, jeśli schemat nie został zainicjowany. Wyjątek zapewni instrukcje wymagające uruchomienia rake db:migrate.
+1

Nie odpowiada to na pytanie, dlaczego musi zaktualizować testową bazę danych. – tangrs

+0

To, co to robi, to nie tylko podnoszenie, gdy schemat testowy ma oczekujące migracje , Railsy będą próbowały załadować schemat. Wyjątek: teraz zostanie podniesiony tylko wtedy, gdy są oczekujące migracje po załadowaniu schematu . Istnieje kilka ograniczeń, o których należy pamiętać podczas korzystania z tego: Migracja nadal musi być uruchamiana ręcznie; chociaż teraz należy to zrobić tylko w środowisku "rozwoju" Wyjątek zostanie zgłoszony, jeśli schemat nie został zainicjowany. Wyjątek zapewni instrukcje określające prowizję db: migrate należy uruchomić. –

+1

Powinieneś edytować to w swojej odpowiedzi. – tangrs

1

Może to wynikać z dwóch powodów.

  1. Być może brakowało go skonfigurować w config/environments/test.rb

Dodaj config.active_record.maintain_test_schema = true jeśli nie masz go lub ustawić go na true jeśli postawił go false.

Z docs

config.active_record.maintain_test_schema jest wartość logiczna, która określa, czy Active Record powinien starać się utrzymać w bazie testu schematu up-to-date z db/schema.rb (lub db/structure.sql) po uruchomieniu testów. Wartością domyślną jest true.

  1. Możecie mieć oczekujące migracje po schemat został załadowany

Z rspec docs

Co to robi jest to, że raczej niż podnoszenie, gdy schemat testowy oczekuje na migracje, Railsy spróbują załadować schemat.Wyjątek zostanie teraz podniesiony tylko w przypadku oczekujących migracji po wczytaniu schematu.

Sprawdź, czy masz oczekujące migracje z rake db:migrate:status

Ponadto, jeśli używasz SQLite 3.7.9, należy przyjrzeć się tej discussion

+0

Jeśli wartość domyślna to prawda, dlaczego muszę ją dodać? – ardavis