用Factory Girl强制保存id

时间:2014-08-23 00:34:34

标签: ruby-on-rails rspec

这是我的集成规范:

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。

如何解决这个问题,强迫身份?

我应该强迫身份证吗?当用户是内置用户时,我该如何测试?

2 个答案:

答案 0 :(得分:0)

尝试使用FactoryGirl.create而不是build。

答案 1 :(得分:0)

您无法强制使用id:您的规范的重点是测试用户是否由您的控制器代码创建(因为您正在编写可能不会编写的集成规范)想要删除记录的实际保存。)

您的控制器代码不会让您强制创建记录的ID,(在现实世界中,您不希望让用户这样做),因此您工厂的设置不会出现问题。无所谓。

由于您要测试的是该页面包含指向新创建用户的show页面的链接,您只需要该用户的id:而不是使用工厂构建对象的id,使用{{1 }}

也可能是一个想法,也规定实际创建了一个新用户(即User.last.id已更改)