RSpec与FactoryGirl明确主题

时间:2016-05-03 21:26:11

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

我在Ruby on Rails环境中使用RSpec和FactoryGirl进行测试。

我想按如下方式指定我的工厂:

  factory :user do
    role # stub

    factory :resident do
      association :role, factory: :resident_role
    end

    factory :admin do
      association :role, factory: :admin_role
    end
  end

我想在我的规范中做这样的事情:

require 'rails_helper'

RSpec.describe User, type: :model do
  context "all users" do
    # describe a user
    #   subject { build(:user) }
    #   it { is_expected.to be_something_or_do_something }
  end

  context "residents" do
    # describe a resident
    #   subject { build(:resident) }
    #   it { is_expected.to be_something_or_do_something }
  end

  context "admins" do
    # describe a admin
    #   subject { build(:admin) }
    #   it { is_expected.to be_something_or_do_something }
  end

end

可以通过明确设置subject来完成吗?当我这样做时,我不断收到重复的角色错误。

如果有人有任何建议或意见,我们将不胜感激!

3 个答案:

答案 0 :(得分:3)

  

但是这会导致user_spec.rb使用:user factory。

不,它没有。假设您正确配置了FactoryGirl,RSpec可以使用您喜欢的任何工厂"按需提供#34;在任何测试文件中。配置方面,在rails_helper.rb中抛出此内容:

RSpec.configure do |config|
   # ...
   config.include FactoryGirl::Syntax::Methods
   # ...
end

然后,在您的spec文件中:

require 'rails_helper'

RSpec.describe User, type: :model do
  context "all users" do
    let(:user) { create(:user) } 

    it 'is a user' do 
      # Here `user` is going to be a user factory
      expect(user.unit).not_to be_present
    end

  end

  context "residents" do
    let(:user) { create(:resident) } 

    it 'is a resident' do 
      # Here `user` is going to be a resident factory
      expect(user.unit).to be_present
    end
  end

  context "admins" do
    let(:user) { create(:admin) } 

    it 'is an admin' do 
      # Here `user` is going to be an admin factory
      expect(user.role).to be('admin_role')
    end
  end

end

简而言之,您可以对任何一个路径中存在的任何工厂定义使用create(<factory_name>)

test/factories.rb
spec/factories.rb
test/factories/*.rb
spec/factories/*.rb

请注意,如果您未将config.include FactoryGirl::Syntax::Methods放入RSpec.configure,您仍可以FactoryGirl.create(<factory_name>)代替create(<factory_name>)创建任何工厂。< / p>

答案 1 :(得分:0)

我认为您不想阻止它们自动加载,我不确定您的用例是什么不允许它们加载?

RSpec automagically fetches the factory for a spec 当我相信你的规范助手加载时,Rspec将所有工厂加载到内存中。因为您在使用工厂继承时只需在测试运行之前将其中的每一个加载到内存中,所以不会调用任何对象,也不会创建或构建任何对象。它们随时可用于您的测试。

您是否收到特定错误,或者是否有某些情况我没有看到您需要?

答案 2 :(得分:0)

我在这里找到了解决问题的方法:https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#associations

我需要在用户工厂中使用association :role, factory: :role, strategy: :build