今天我遇到了令人惊讶的Rails / Rspec / FactoryGirl(?)怪癖。我已经找到了解决办法,但我一开始就对问题发生的原因感兴趣。
我的例子:
let(:old_user) { build(:user) }
let(:new_user) { create(:user) }
let(:post) { build(:post, user: old_user) }
it 'sets the new user' do
post.user_id = new_user.id
post.save
post.reload
post.user.should == new_user
end
此测试失败。未正确分配用户,在测试结束时post.user
仍为old_user
。 (这也是一个完全没用的测试。)
有两种方法可以让测试通过。一个是create
old_user
,因此在尝试重新分配之前设置post.user_id
。另一种方法是将post.user_id = new_user.id
替换为post.user = User.find(new_user.id)
。但我好奇......
当测试失败时,原始代码在幕后发生了什么?
编辑:按要求添加工厂。
FactoryGirl.define do
factory :user do
# We actually use Faker, but for this purpose I gave strings
name 'Test User'
email 'example@example.com'
password 'changeme'
password_confirmation 'changeme'
end
end
# The Post class has `belongs_to :user`
FactoryGirl.define do
factory :post do
body 'I am a post'
end
end