ActiveModel :: MissingAttributeError:抛出测试而不是控制台

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActiveModel :: MissingAttributeError:抛出测试而不是控制台相关的知识,希望对你有一定的参考价值。

我是Rails的新手,我正在尝试建立一个非常简单的模型。有三种模型类:Solution,Pro和Con。优点和缺点是这样的解决方案的孩子:

class Solution < ActiveRecord::Base
  include BasicValidations
  has_many :pros
  has_many :cons
end

class Con < ActiveRecord::Base
    belongs_to :solution
end

class Pro < ActiveRecord::Base
    belongs_to :solution
end

但是,如果我尝试按如下方式运行测试:

def setup
  @test_class = Solution
  @solution = FactoryGirl.create(:solution)
end

test "Solutions can take pros" do
  c = @solution.pros.create(description: "pros")
  assert_includes(@solution.pros, c,"Could not add pro to solution") 
end

我收到以下错误:

2) Error:
  SolutionTest#test_Solutions_can_take_pros:
  ActiveRecord::UnknownAttributeError: unknown attribute 'solution_id' for   Pro.
    test/models/solution_test.rb:12:in `block in <class:SolutionTest>'

...但仅在某些时候,如果在rails控制台中手动执行相同的测试!

这是数据库迁移:

class AddProsAndConsToSolution < ActiveRecord::Migration
  def change
    change_table :pros do |t|
      t.belongs_to :solution, index: true
    end

    change_table :cons do |t|
      t.belongs_to :solution, index: true
    end
  end  
end

......和架构:

ActiveRecord::Schema.define(version: 20150323133049) do

  create_table "cons", force: :cascade do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "description", limit: 255
    t.integer  "solution_id"
  end

  add_index "cons", ["solution_id"], name: "index_cons_on_solution_id"

  create_table "pros", force: :cascade do |t|
    t.string   "description", limit: 255
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "solution_id"
  end

  add_index "pros", ["solution_id"], name: "index_pros_on_solution_id"

  create_table "solutions", force: :cascade do |t|
    t.string   "description", limit: 255
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end

我正在运行Rails 4.2.1。

有什么想法吗?看起来很简单,我一定错过了一些明显的东西,但它偶尔在测试和控制台中工作的事实让我感到困惑。

答案

尝试使用rake db:reset RAILS_ENV=test,它将丢弃现有数据库(rake db:drop),重新创建它(rake db:create),加载从当前开发db条件(rake db:schema:load)检索的模式,并播种数据库(rake db:seed),所有这些只在test数据库配置中,在config / database.yml文件中确定,并通过将RAILS_ENV全局变量设置为test来设置。

如果在rails控制台中手动执行相同的测试

它起作用,因为测试在测试RAILS_ENV中运行,并且您的控制台处于开发RAILS_ENV中。 您可以通过键入以下命令来访问测试环境的控制台:rails console test

另一答案

你完成了迁移测试数据库的工作吗?

rake db:migrate RAILS_ENV=test

以上是关于ActiveModel :: MissingAttributeError:抛出测试而不是控制台的主要内容,如果未能解决你的问题,请参考以下文章

在 ActiveModel::Serializer 中序列化错误哈希

是否可以在 Rails 控制器之外使用 ActiveModel::Serializers?

rails create方法ActiveModel::ForbiddenAttribute的问题

ActiveModel :: ForbiddenAttributesError使用旧版本的Ruby? [重复]

Rails ActiveModel 序列化程序呈现非空属性

尝试运行 rspec 时,我得到“未初始化的常量 ActiveModel”