Pau*_*aul 4 ruby-on-rails functional-testing factory-bot
在尝试编写rSpec测试时,我对如何生成具有关联的FactoryGirl记录有些困惑。
基本上,我有一个Quiz模型和一个Question模型。它们通过HABTM关联进行关联。
这是我的Quiz工厂:
FactoryGirl.define do
factory :quiz do
description 'Test'
# after(:create) { |quiz| quiz.create_sample_questions }
# trait :with_questions do
# after :create do |quiz|
# 5.times do |q|
# quiz.questions << FactoryGirl.create(:question, :with_answers)
# end
# end
# end
end
end
Run Code Online (Sandbox Code Playgroud)
最好在这里创建一个特征,然后为测验创建示例问题吗?还是应该使用after create方法来做到这一点?
两者似乎都不起作用,我的特质似乎也没有引发问题。
谢谢!
我更喜欢使用特质,因为它们会使规格变得更整洁。当然,重要的是要确保工厂本身不会过于混乱。
每当我定义一个建立关联的特征时,我都会确保可以在关联中建立可变数量的记录,而FactoryGirls可以很容易地做到这一点:
FactoryGirl.define do
factory :quiz do
description 'Test'
trait :with_questions do
ignore { question_count 5 }
questions { build_list(:question, question_count) }
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在,您可以按照自己的规范来构建或创建测验:
FactoryGirl.create(:quiz, :with_questions)
FactoryGirl.build(:quiz, :with_questions, question_count: 2)
Run Code Online (Sandbox Code Playgroud)
请注意,特征使用build_list,因此默认情况下不会保留问题,question_count而questions_count不会使它永远不会与计数器缓存冲突。
为了确保您的规格没有做更多的事情,我不会提出带有答案的问题,而只是提出问题(除非您的验证要求他们这样做)。如果您确实需要答案的问题,则可以添加另一个特征:
FactoryGirl.define do
factory :quiz do
description 'Test'
ignore { question_count 5 }
trait :with_questions do
questions { build_list(:question, question_count) }
end
trait :with_answered_questions do
questions { build_list(:question, question_count, :with_answers) }
end
end
end
Run Code Online (Sandbox Code Playgroud)
有关将关联与FactoryGirl一起使用的更多信息,请参见FactoryGirl文档。
我有兴趣看到这个问题的其他答案,但我可以讲述我使用工厂、关联以及通过回调自动加载一堆对象的个人经验。
基本上,我发现我尝试使用特征和回调越“狂热”,我给规范的未来造成的麻烦就越多。有了这种扭曲的逻辑,你最终会看到一片混乱的工厂,你会摸不着头脑,想知道到底发生了什么。
完全假设的问题:如果稍后您需要一个包含4 个问题的测验怎么办?嗯,每个都quiz :with_questions包含 5 个问题。然后你会创造一个名为 的特质吗with_4_questions?;)
根据我的经验,我建议您首先在规格内生成单独的模型并保持简单。不要抽象出回调背后的太多逻辑。
假设我正在使用您的模型编写功能规范。这就是我将如何做你想要完成的事情:
feature 'User edits a question' do
let!(:quiz) { FactoryGirl.create(:quiz) }
before do
5.times { FactoryGirl.create(:question, quiz: quiz) }
end
scenario 'with valid input' do
# ...
end
end
Run Code Online (Sandbox Code Playgroud)
如果您发现自己经常需要quizwith 5 questions,您可以使用 Railscasts 演示的方法创建一个宏。至少这样你就可以创建一个可以传递参数的方法,就像num_questions我上面完全假设的问题一样。
| 归档时间: |
|
| 查看次数: |
5431 次 |
| 最近记录: |