我有以下型号:
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(?,?,?,?,?)
为什么?在文档中,它表示要设置关联,您只需编写工厂名称,在我的例子中是用户。
由于
答案 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 }
语句
这允许你不要使用这么多的实例变量,如果需要我可以提供一个例子,如果这个解释不够