ruby-on-rails - 工厂女孩特质

标签 ruby-on-rails factory-bot functional-testing

在尝试编写 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

最好在这里创建一个特征,然后为测验创建示例问题吗?或者我应该使用 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

您现在可以在规范中构建或创建测验:
FactoryGirl.create(:quiz, :with_questions)
FactoryGirl.build(:quiz, :with_questions, question_count: 2)

请注意,特征使用 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

有关使用与 FactoryGirl 的关联的更多信息,请参阅 FactoryGirl documentation .

关于ruby-on-rails - 工厂女孩特质,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17498434/

相关文章:

testing - 如何自动化ajax测试?

phantomjs - Geb 测试通过 Chrome,失败 PhantomJS

ruby-on-rails - 未定义的方法每个 rails 错误

ruby-on-rails - 当 Test::Unit 测试运行时,我如何才能看到实际发生了什么?

ruby-on-rails - 如何在 rspec 测试中 stub gmaps4rails 地理编码函数?

ruby-on-rails - 创建记录后更改工厂的属性

symfony - 如何在 liip 功能测试(symfony 2.8)中附加固定装置?

ruby-on-rails - 在 Rails 中初始化 API 客户端的好地方是什么?

jquery - Rails 3.1 提交表单而不刷新

ruby-on-rails - 在 factorygirl 中,有什么方法可以在初始化 field2 时引用 field1 的值?