ruby-on-rails - 使用来自其他工厂的数据创建工厂

标签 ruby-on-rails testing factory-bot

我正在尝试创建一个 FactoryGirl 工厂,它依赖于在创建时从其他模型传递的信息。这是我目前所拥有的:

FactoryGirl.define do
  factory :completed_set do
    user_id 1
    user_program_id 1
    exercise_id 1
    workout_exercise_id 1
    workout_exercise_set_id 1
    program_id 1
    training_week_id 1
    workout_id 1
    set_number 1
    repetitions 1
    weight 1.5
  end
end

问题是 user_id 需要是实际的 user_id,其他几个字段也是如此。我可以执行 before(:create),但我希望能够调用 FactoryGirl.attributes_for(:completed_set),这将返回初始值,而不是我想要的值。

有什么想法吗?

最佳答案

阅读documentation关于协会。

如果你有工厂:用户你可以这样做:

FactoryGirl.define do
  factory :completed_set do
    user
    # ... left out for brevity
  end
end

如果你不这样做,你可以指定工厂:

FactoryGirl.define do
  factory :completed_set do
    association :user, factory: :special_user
    # ... left out for brevity
  end
end

也就是说:我认为使用嵌套工厂是一种糟糕的风格。在应用程序的早期阶段解决一个特定问题似乎是个好主意。但如果您在另一个测试中依赖这个工厂,它很可能会引入意想不到的副作用。

在我看来,最好在测试的设置阶段构建对象的层次结构:

def setup
  user = FactoryGirl.create(:user)
  @completed_set = FactoryGirl.create(:completed_set, user: user)
end

这样您就可以确切地知道创建了哪些对象以及它们是如何绑定(bind)在一起的。

除了设置关联用户(Rails 通过将 user_id 设置为 user.id 来建立)之外,您还可以直接设置 user_id:

def setup
  user = FactoryGirl.create(:user)
  @completed_set = FactoryGirl.create(:completed_set, user_id: user.id)
end

希望这对您有所帮助。

关于ruby-on-rails - 使用来自其他工厂的数据创建工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27392001/

相关文章:

ruby-on-rails - 阻止 Unicorn Server 进程运行的最佳方法是什么?

MySQL 与 JRuby 的问题

ruby-on-rails - Ruby on Rails 标签函数。为什么radio_button_tag.id 的大小写与label.for 不匹配?

ruby-on-rails - 测试期间的 ActionView::MissingTemplate

mysql - 数据库在测试环境中排序不正确?

jquery - 下载带有 HTTP "Authorization" header 集的文件

python - python 中的 Stroop 测试无法正常工作。

c# - 自定义 NLog 过滤器类的单元测试

ruby-on-rails - 测试设计 - Capybara::ElementNotFound:无法找到 xpath "/html"

ruby-on-rails - FactoryGirl 没有给出有用的验证错误