我在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
来完成吗?当我这样做时,我不断收到重复的角色错误。
如果有人有任何建议或意见,我们将不胜感激!
答案 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