这是我的集成规范:
let(:user){ FactoryGirl.build :user }
subject { page }
feature 'authentication' do
describe 'guest signs up' do
before do
sign_up user
end
it { should have_title user.user_name }
it { should have_link user.user_name, href: user_path(user.id) }
end
end
规范it { should have_link user.user_name, href: user_path(user.id) }
失败。为什么?这是错误的。
我已经在内存中构建了工厂,因此它没有id,因此规范失败了。但是,如果我给它一个这样的id:
factory :user do
password = Faker::Internet.password
id 3
first_name { Faker::Name.first_name }
last_name { Faker::Name.last_name }
user_name { Faker::Internet.user_name }
password { password }
password_confirmation { password }
email { Faker::Internet.email }
uuid { SecureRandom.uuid }
end
规范仍然失败。它的实际ID是10
。这个10是由我认为的活跃记录创建的,并且覆盖了我的愿望,即id为3。
如何解决这个问题,强迫身份?
我应该强迫身份证吗?当用户是内置用户时,我该如何测试?
答案 0 :(得分:0)
尝试使用FactoryGirl.create而不是build。
答案 1 :(得分:0)
您无法强制使用id:您的规范的重点是测试用户是否由您的控制器代码创建(因为您正在编写可能不会编写的集成规范)想要删除记录的实际保存。)
您的控制器代码不会让您强制创建记录的ID,(在现实世界中,您不希望让用户这样做),因此您工厂的设置不会出现问题。无所谓。
由于您要测试的是该页面包含指向新创建用户的show页面的链接,您只需要该用户的id:而不是使用工厂构建对象的id,使用{{1 }}
也可能是一个想法,也规定实际创建了一个新用户(即User.last.id
已更改)