factory_girl,rpsec 2.0和rails 3.0 =>的问题不能让has_one关系很好地协同工作!

时间:2010-10-13 23:08:44

标签: ruby-on-rails rspec factory-bot

我正在运行rails 3.0,rspec 2.0和factory_girl。以下是我正在使用的简化方案:用户一次只能订阅一个计划

# user.rb
class User < ActiveRecord::Base
  has_one :plan
  attr_accessible :login, :plan_id

end

# plan.rb
class Profile < ActiveRecord::Base
 attr_accessible :plan
end

# user_factory.rb
Factory.define :user do |u|
  u.login "test"
  u.association :plan
end

#plan_factory.rb
Factory.define :plan do |p|
   p.name "plan1"
end

当我运行rspec spec / models / user_spec.rb时出现此错误:

失败/错误:user = Factory(:user)      SQLite3 :: ConstraintException:users.plan_id可能不是NULL

#spec/models/user_spec.rb
require File.dirname(__FILE__) + '/../spec_helper'

describe User do
  it "should be valid" do
    user = Factory(:user)
    #User.new.should be_valid
    user.should be_valid
  end
end

我做错了什么?我坚持这个非常简单的场景,这非常令人沮丧。那时候BDD让我慢慢下来!

2 个答案:

答案 0 :(得分:0)

您似乎错误地实施了has_one关联。 has_one -- belongs_to关系中的外键应该放在与belongs_to指令的模型对应的表中。检查db/schema.rb - 我想您会发现plan_id表中定义了users。如果您希望User模型有一个Plan,则需要从plan_id移除users并将user_id添加到plans

如果你想让Plan有一个User,请保持架构不变,并将has_one :user放入Planbelongs_to :plan User

答案 1 :(得分:0)

用户订阅了一个计划。因此,用户有一个计划,计划与许多用户相关。所以我认为我做对了。错误发生在用户工厂中。 取代

u.association :plan

通过

u.association :plan, :factory => :plan

解决了这个问题。

问题解决了!