QA@IT
«質問へ戻る

質問を投稿

Rails4での外部結合を使っている場合のDatabaseRewinder

  • Rails4.1.4
  • Rspec 3.0.0

の環境で、Postgresql(brewでv 9.3.5)を使用しています。

  • gem foreigner を用いて外部結合を使った設計をしていた
  • rspec でDatabaseRewinder.clean_allしている
  • モデル、コントローラのテストを順調に作っていた

  • MacOSを再インストールして環境を作りなおした

その後。環境再構築後から、

PG::ForeignKeyViolation: ERROR:  update or delete on table "courses" violates foreign key constraint "services_course_id_fk" on table "services" (ActiveRecord::InvalidForeignKey)
DETAIL:  Key (id)=(0) is still referenced from table "services".

と、エラーが出るようになりました。
外部結合の制約をつけているので、当然のエラーだと思いますが、

  • なぜ、環境再構築前はDatabaseRewinder.clean_allできてたのか。(外部制約が設定されていたのは確認してます)
  • foreignerを用いた場合、DatabaseRewinder.clean_allでこのエラーが出てしまうの回避できるのか?

というのが質問です。

念のため、rails_helper.rbの内容です。

ENV["RAILS_ENV"] ||= 'test'
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/rails' #require 'rspec/autorun'
require 'email_spec'
require 'shoulda-matchers'
require 'capybara/rails'
require 'capybara/rspec'
require 'capybara-screenshot/rspec'
require 'capybara/poltergeist' #require 'capybara/webkit'
require 'devise'
Capybara.javascript_driver = :poltergeist_debug
Capybara.register_driver :poltergeist_debug do |app|
  Capybara::Poltergeist::Driver.new(
    app, inspector: true, js_errors: false, timeout: 120
  )
end
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.before :suite do
    OmniAuth.config.test_mode = true
    FactoryGirl.reload
    DatabaseRewinder.clean_all
    require Rails.root.join('db', 'seeds.rb')
  end

  config.after :each do
    DatabaseRewinder.clean
  end
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!

  ## Capybara
  config.include Capybara::DSL # capybara configration

  # FactoryGirl
  config.include FactoryGirl::Syntax::Methods # factorygirl FactoryGirlを省略

  # EmailSpec
  config.include(EmailSpec::Helpers)
  config.include(EmailSpec::Matchers)

  # Devise etc..
  config.include Devise::TestHelpers, type: :controller
  config.include OmniauthMacros
  config.extend ControllerMacros
end

よろしくお願いいたします。

- Rails4.1.4
- Rspec 3.0.0

の環境で、Postgresql(brewでv 9.3.5)を使用しています。

- gem foreigner を用いて外部結合を使った設計をしていた
- rspec でDatabaseRewinder.clean_allしている
- モデル、コントローラのテストを順調に作っていた

- MacOSを再インストールして環境を作りなおした

その後。環境再構築後から、

```
PG::ForeignKeyViolation: ERROR:  update or delete on table "courses" violates foreign key constraint "services_course_id_fk" on table "services" (ActiveRecord::InvalidForeignKey)
DETAIL:  Key (id)=(0) is still referenced from table "services".
```

と、エラーが出るようになりました。
外部結合の制約をつけているので、当然のエラーだと思いますが、

- なぜ、環境再構築前は`DatabaseRewinder.clean_all`できてたのか。(外部制約が設定されていたのは確認してます)
- foreignerを用いた場合、`DatabaseRewinder.clean_all`でこのエラーが出てしまうの回避できるのか?

というのが質問です。


念のため、rails_helper.rbの内容です。
```
ENV["RAILS_ENV"] ||= 'test'
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/rails' #require 'rspec/autorun'
require 'email_spec'
require 'shoulda-matchers'
require 'capybara/rails'
require 'capybara/rspec'
require 'capybara-screenshot/rspec'
require 'capybara/poltergeist' #require 'capybara/webkit'
require 'devise'
Capybara.javascript_driver = :poltergeist_debug
Capybara.register_driver :poltergeist_debug do |app|
  Capybara::Poltergeist::Driver.new(
    app, inspector: true, js_errors: false, timeout: 120
  )
end
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.before :suite do
    OmniAuth.config.test_mode = true
    FactoryGirl.reload
    DatabaseRewinder.clean_all
    require Rails.root.join('db', 'seeds.rb')
  end

  config.after :each do
    DatabaseRewinder.clean
  end
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!

  ## Capybara
  config.include Capybara::DSL # capybara configration
  
  # FactoryGirl
  config.include FactoryGirl::Syntax::Methods # factorygirl FactoryGirlを省略

  # EmailSpec
  config.include(EmailSpec::Helpers)
  config.include(EmailSpec::Matchers)

  # Devise etc..
  config.include Devise::TestHelpers, type: :controller
  config.include OmniauthMacros
  config.extend ControllerMacros
end
```

よろしくお願いいたします。