测试Rspec时,FactoryGirl和belongs_to关联

时间:2013-03-30 20:32:38

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

我有以下型号:

class Team < ActiveRecord::Base
  # Setup accessible (or protected) attributes for your model
  attr_accessible :name
  validates_presence_of :name

  belongs_to :user

end

通过以下方式测试:

describe Team do

  before(:each) do
    @attr = FactoryGirl.attributes_for(:team)
  end

  it "should belong to a user" do
    @team = Team.create!(@attr)
    @team.should belong_to(:user)
  end
end

我有以下工厂:

FactoryGirl.define do
  factory :team do
    name 'Dream Team'
    sport
    user
  end
end

FactoryGirl.define do
  factory :user do
    name 'Test User'
    last_name 'Last Name'
    email 'example@example.com'
    password 'changeme'
    password_confirmation 'changeme'
  end
end

当我测试规范时,我遇到以下故障:

  

1)团队应属于用户        失败/错误:@team = Team.create!(@ attr)        ActiveRecord的:: StatementInvalid:          SQLite3 :: ConstraintException:teams.user_id可能不是NULL:INSERT INTO“teams”(“created_at”,“name”,“sport_id”,“updated_at”,   “user_id”)VALUES(?,?,?,?,?)

为什么?在文档中,它表示要设置关联,您只需编写工厂名称,在我的例子中是用户。

由于

2 个答案:

答案 0 :(得分:4)

FactoryGirl.attributes_for将为您提供仅包含指定模型的属性的哈希值,不包括关联属性 - 在您的情况下为user_id

如果user_id是必填字段,并且您尝试使用Team创建FactoryGirl.create(attributes_for(:team))的实例,则会出现错误。

但是,如果您使用FactoryGirl.create(:team),则应该为您提供Team的有效实例。

答案 1 :(得分:0)

根据The Rails 4 Way第21章,您不应该将before(:each)与FactoryGirl和Rspec一起使用,实际上是一种更优雅的创建此测试的方法,就是在它之前使用let(:team) { FactoryGirl.create(:team }语句

这允许你不要使用这么多的实例变量,如果需要我可以提供一个例子,如果这个解释不够