ruby on rails 4:即使在rake db:test:prepare之后也找不到表'table_name'

时间:2013-08-02 07:20:18

标签: ruby-on-rails rspec ruby-on-rails-4

即使在执行rake db:test:prepare后,我收到以下错误。我正在运行rails 4.0。

1) Core::PostsController GET index assigns all posts as @posts
     Failure/Error: post = Post.create! valid_attributes
     ActiveRecord::StatementInvalid:
       Could not find table 'core_posts'
     # ./spec/controllers/core/posts_controller_spec.rb:36:in `block (3 levels) in <module:Core>'

我在引擎内运行此测试,那么它可能是相关的吗?我的测试看起来像这样:

module Core
  describe PostsController do

    # This should return the minimal set of attributes required to create a valid
    # Post. As you add validations to Post, be sure to
    # adjust the attributes here as well.
    let(:valid_attributes) { {  } }

    # This should return the minimal set of values that should be in the session
    # in order to pass any filters (e.g. authentication) defined in
    # PostsController. Be sure to keep this updated too.
    let(:valid_session) { {} }

    describe "GET index" do
      it "assigns all posts as @posts" do
        post = Post.create! valid_attributes
        get :index, {}, valid_session
        assigns(:posts).should eq([post])
      end
    end


  end
end

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:2)

cd进入引擎目录&amp;生成一个用于测试引擎的虚拟应用程序:

rails plugin new . --full --mountable --dummy-path spec/dummy

上面的命令将生成一个带有隔离命名空间的完全可安装引擎,这意味着该引擎中的所有控制器和模型都将在引擎的命名空间内隔离。例如,稍后Post模型将被称为Core::Post,而不仅仅是Post。由于您已经生成了应用程序 - 如果发生冲突,您可以跳过更改。

此外,引擎附带一个虚拟应用程序,位于spec/dummy,因为我们告诉它使用--dummy_path选项执行此操作。这个虚拟应用程序只是一个简单的Rails应用程序,可用于测试引擎,就好像它已安装在实际应用程序中一样。

然后,您需要通过进行以下更改来更改rspec以使用此虚拟应用程序:

spec/spec_helper.rb内更改此行

require File.expand_path("../../config/environment", __FILE__)

到这个

require File.expand_path("../dummy/config/environment",__FILE__)

由于config/environment.rb文件不在两个目录中,而是在spec/dummy内。

现在,您可以通过以下命令运行迁移。

RAILS_ENV=test bin/rake db:migrate

为什么不db:test:prepare?

我们无法运行rake db:test:prepare因为它不可用。这个 db:migrate任务特别针对引擎进行了更改,并将在spec/dummy/db文件夹中运行引擎PLUS迁移的迁移。

答案 1 :(得分:0)

尝试重新创建测试数据库

没有rbenv

RAILS_ENV=test rake db:drop
RAILS_ENV=test rake db:create
RAILS_ENV=test rake db:test:prepare

使用rbenv

RAILS_ENV=test bundle exec rake db:drop
RAILS_ENV=test bundle exec rake db:create
RAILS_ENV=test bundle exec rake db:test:prepare