【发布时间】:2018-05-30 13:57:04
【问题描述】:
我正在为我的模型编写测试,但遇到了一个我似乎无法解决的错误。我正在使用 rspec 和 Fabricator。单独测试时一切正常,但是当我尝试测试关联时,我得到一个 ActiveModel::MissingAttributeError。
models/user.rb
class User < ApplicationRecord
...
validates :email, uniqueness: true, presence: true
belongs_to :company, required: false
end
models/company.rb
class Company < ApplicationRecord
validates :organisation_number, uniqueness: true, presence: true
has_many :users, dependent: :destroy
end
架构
create_table "companies", force: :cascade do |t|
t.string "organisation_number"
...
end
create_table "users", id: :serial, force: :cascade do |t|
t.string "email", default: "", null: false
...
t.bigint "company_id"
t.index ["company_id"], name: "index_users_on_company_id"
...
end
fabricators/user_fabricator.rb
Fabricator :user do
email { Faker::Internet.email }
password '123456'
confirmed_at Time.now
end
fabricators/company_fabricator.rb
Fabricator :company do
organisation_number { Faker::Company.swedish_organisation_number }
end
spec/user_spec.rb(第一次测试通过,第二次失败)
describe User do
context '#create' do
it 'Creates a user when correct email and password provided' do
user = Fabricate(:user)
expect(user).to be_valid
end
it 'Lets assign a company to user' do
company = Fabricate(:company)
expect(Fabricate.build :user, company: company).to be_valid
end
end
end
我还尝试将公司直接添加到用户制造商,就像这样(在我看来,这就像 documentation 的正确实现):
Fabricator :user do
email { Faker::Internet.email }
password '123456'
confirmed_at Time.now
company
end
反之,将用户添加到 Company fabricator,如下所示:
Fabricator :company do
organisation_number { Faker::Company.swedish_organisation_number }
users(count: 3) { Fabricate(:user) }
end
但是这两种方法都给我留下了同样的错误:
User#create 让我们将公司分配给用户
失败/错误:company = Fabricate(:company)
ActiveModel::MissingAttributeError: can't write unknown attribute 'company_id'
对我做错了什么有什么建议吗?
【问题讨论】:
-
您的用户表是否有
company_id列,因为错误表明它没有 -
@engineersmnky 是的,确实如此。抱歉,忘记添加架构(现在更新问题)
-
您确定您的测试数据库再次包含该列,因为错误表明
company_id不是User的属性。确保 spec_helper 文件包含此行ActiveRecord::Migration.maintain_test_schema!或尝试运行RAILS_ENV=test rake db:migrate -
太棒了!这做到了。如果您能多解释一下这条线的作用以及我的数据库为什么没有同步,我很乐意将其标记为已接受的答案。
标签: ruby-on-rails ruby activerecord rspec fabricator