首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有关于如何使用FactoryGirl构造嵌套模型的Rails约定吗?

有关于如何使用FactoryGirl构造嵌套模型的Rails约定吗?
EN

Stack Overflow用户
提问于 2014-01-09 18:43:13
回答 1查看 135关注 0票数 0

有一部分BDD,我真的很困惑。我有各种不同的要求规格需要测试。结构如下:

  • 用户has_many产品
  • 产品has_many PriceLevels
  • PriceLevel has_many价格

我对如何使用FactoryGirl建立工厂感到困惑。我熟悉联想和特质的概念。我熟悉buildcreate的概念。但我不确定在什么情况下使用这些。

我最能表达困惑的方法就是举几个例子。

  • 我有一个测试User注册的请求规范。我不是因为明显的原因而在这里使用工厂。这我能理解。
  • 我有一个请求规范来测试创建新UserProducts。我create一个用户工厂。我假设这里需要使用create而不是build,因为ProductsController中的CRUD方法对通过URL传递的id执行AR find。如果我错了就纠正我。
  • 我有一个请求规范来测试为一个PriceLevels添加不同的Product。这里我使用两个工厂:UserProduct
  • 我有一个请求规范来测试为User's Product's PriceLevel添加不同的Product。现在,我有多达3家工厂:UserProductPriceLevel

现在,如果Price有一个带有类似Currency的东西的has_and_belongs_to_many怎么办?工厂正在失控。

我会说,当我到达PriceLevel时,我想要一个工厂,它可以让我立即创建整个结构。然而,我不想每次创建一个完整的结构()。此外,这些工厂可以自下而上或自上而下创建。

哪种方式更好,自下而上还是自上而下?我可以创建干代码,为我提供一个工厂的选项,或者一次性创建整个系统吗?我能用特征包装after(:create)块吗?我会在请求规范中使用build vs create吗?

非常感谢您的关注!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-09 19:07:26

首先,请求规范中的buildcreate

我通常在控制器规范中使用buildbuild_stubbed,通过阻塞Model.find来返回构建的实例。但是,在特性或请求规范中应该避免一般的嘲弄,所以请继续在这里使用create

至于主要的问题:

这听起来是个完美的特征案例。一般来说,基本工厂应该只具有建立有效模型所需的属性。然后,特征可以用来为常见或冗长的场景制作方便的“别名”。

您可以使用before(:create)构建和分配相关模型。当FG最终在内部调用save/create时,Rails将处理所有的保存工作。

示例:

代码语言:javascript
运行
复制
factory :user do
  # ...

  trait :with_products do
    before(:create) do |user|
      user.products = build_list(:product, 3)
    end
  end

  trait :with_priced_products do
    before(:create) do |user|
      user.products = build_list(:product, 3, :with_prices)
    end
  end
end

factory :product do
  # ...

  trait :with_prices do
    before(:create) do |product|
      product.prices = build_list(:price, 3)
    end
  end
end

factory :price

如果您想自定义在构建时添加了多少产品/价格,您只需添加ignored属性并通过前挂钩的2参数形式使用它们。

代码语言:javascript
运行
复制
ignore do
  number_of_products 3
end

before(:create) do |user, evaluator|
  user.products = build_list(product, evaluator.number_of_products)
end

如果您希望能够在with_build_stubbed场景中使用这些特性,则必须在每种情况下使用正确的策略复制相关的钩子。目前还没有一个简单的方法可以说“使用与模型相同的策略添加一些关系”,尽管这也是我自己的愿望清单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21028538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档