rspec返回“PG ::错误:错误:关系”table_name“不存在”

时间:2012-03-05 05:47:00

标签: ruby-on-rails-3 postgresql rspec rspec2 rails-postgresql

环境是REE(2011.12)关于rvm,rspec 2.8.0,rails 3.0.6和pg 0.13.2。在CentOS 5.6上使用PostgreSQL 8.3.17。 db:migrate可以正常工作。但是rspec有以下错误。

1) ApiController articles OK
 Failure/Error: Unable to find matching line from backtrace
 ActiveRecord::StatementInvalid:
   PG::Error: ERROR:  relation "table_name" does not exist
   : DELETE FROM "table_name"

我正在使用rspec 1.x系列将我的项目从rails 2.3.5更新为使用rspec2的rails 3.0。复制了所有的rspec测试,我合并了旧的spec_helper.rb和新的(生成rails g rspec:install)。

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|

  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true

end

我读到了有关此错误的类似问题。所以我尝试了rake db:test:preparerake db:test:load,但这不是解决方案。你有什么主意吗? 看起来测试没有在测试数据库上运行......我该怎么办? :(

4 个答案:

答案 0 :(得分:26)

我在两个实例中遇到过这个问题(2012年6月13日更新):

首先:

我还没有迁移我的测试数据库...

rake db:migrate

...您需要在db:test:preparedb:test:load之前完成。

当您调用rspec时,无论如何都应该prepareload您的数据库。你不应该手动这样做。

第二

我移民中的拼写错误。我不小心在参数列表中颠倒了我的表名和列名。

在Rails 3.1项目上进行迁移:

def change
  add_column :had_import_errors, :studies, :boolean, :default => false
  add_column :import_data_cache, :studies, :text
end

... 错误,因为has_import_errorsimport_data_cache是我的列名,因此它们应该排在第二位,而不是第一位。

正确的迁移,首先是表名:

def change
  add_column :studies, :had_import_errors, :boolean, :default => false
  add_column :studies, :import_data_cache, :text
end

答案 1 :(得分:4)

当你在迁移时运行rspec(通常是通过防护)时,通常会发生这种情况。一个简单的解决方案是退出防守,进行迁移并重新启动防护。

答案 2 :(得分:3)

它通常表示存在另一个打开的PostgreSql连接。要冒出正确的错误,请尝试% rake db:test:prepare

运行测试准备显示以下内容,当打开连接(我的情况下是PGAdmin)关闭时,问题得到解决。

rake aborted!
PG::Error: ERROR:  database "xyz_test" is being accessed by other users
DETAIL:  There are 1 other session(s) using the database.
: DROP DATABASE IF EXISTS "xyz_test"

Tasks: TOP => db:test:load => db:test:purge
(See full trace by running task with --trace)

答案 3 :(得分:1)

只是点击同样的错误,没有任何效果,但删除并重新创建数据库,这为我修复了。

rake db:drop db:create db:migrate