1

我收到以下错误,即使在执行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

有任何想法吗?谢谢!

4

2 回答 2

2

cd进入引擎目录并生成一个虚拟应用程序以测试您的引擎:

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运行引擎 PLUS 迁移的迁移。spec/dummy/db

于 2013-08-02T11:26:08.380 回答
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
于 2013-08-02T11:04:41.773 回答