Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 对于如何使用FactoryGirl构造嵌套模型,是否有Rails约定?_Ruby On Rails 3_Bdd_Factory Bot - Fatal编程技术网

Ruby on rails 3 对于如何使用FactoryGirl构造嵌套模型,是否有Rails约定?

Ruby on rails 3 对于如何使用FactoryGirl构造嵌套模型,是否有Rails约定?,ruby-on-rails-3,bdd,factory-bot,Ruby On Rails 3,Bdd,Factory Bot,BDD中有一部分我真的很困惑。我有各种不同的要求规格测试。结构如下: 用户有很多产品 产品有许多价格等级 价格水平有很多价格 我对如何利用FactoryGirl建立工厂感到困惑。我熟悉联想和特质的概念。我熟悉build和create的概念。但我不确定在什么情况下使用这些 我能说出我所困惑的事情的最好方法就是举一些例子 我有一个测试用户注册的请求规范。我在这里不使用工厂,原因很明显。这我理解 我有一个测试用户的请求规范创建新的产品。我创建一个用户工厂。我假设我需要在这里使用create而不是

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

  • 用户有很多产品
  • 产品有许多价格等级
  • 价格水平有很多价格
我对如何利用FactoryGirl建立工厂感到困惑。我熟悉联想和特质的概念。我熟悉
build
create
的概念。但我不确定在什么情况下使用这些

我能说出我所困惑的事情的最好方法就是举一些例子

  • 我有一个测试
    用户注册的请求规范。我在这里不使用工厂,原因很明显。这我理解

  • 我有一个测试
    用户的请求规范
    创建新的
    产品
    。我创建一个用户工厂。我假设我需要在这里使用
    create
    而不是
    build
    ,因为
    ProductsController
    中的CRUD方法对通过URL传递的id执行AR
    find
    。如果我错了,请纠正我

  • 我有一个请求规范,用于测试为
    产品添加不同的
    价格级别
    。这里我使用两个工厂:
    用户
    产品

  • 我有一个请求规范,用于测试为
    用户
    产品
    价格级别
    添加不同的
    价格。现在我有3家工厂:
    用户
    产品
    价格水平

现在,如果
Price
有一个
has\u,并且\u属于\u many
,比如
Currency
?工厂正在失去控制

我想说,当我到达
PriceLevel
时,我想要一个工厂,它可以让我一次创建整个结构。但是,我不想每次都创建整个结构。此外,这些工厂可以自下而上或自上而下创建

自下而上还是自上而下,哪种方式更好?我可以创建一个简单的代码,让我可以选择一个工厂还是一次创建整个shebang?我可以在traits中的(:create)
块之后包装
?我会在请求规范中使用
build
vs
create


非常感谢您的关注

首先,
build
vs
create
在请求规范中:

我通常在控制器规范中通过stubing
Model使用
build
build\u stubed
。查找
以返回生成的实例。然而,一般来说,在特性或请求规范中应该避免模拟,所以继续在这里创建东西

现在主要问题是:

这听起来像是一个完美的例子。通常,基础工厂应该只具有生成有效模型所需的属性。然后可以使用Traits为常见或详细的场景制作方便的“别名”

您可以在(:create)
之前使用
来构建和分配相关模型。当FG最终在内部调用
save
/
create
时,Rails将一起保存所有内容

例如:

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
如果您想自定义在构建时添加多少产品/价格,您可以添加
ignore
d属性,并通过before钩子的2参数形式使用它们

ignore do
  number_of_products 3
end

before(:create) do |user, evaluator|
  user.products = build_list(product, evaluator.number_of_products)
end
如果您希望能够在
build
build\u stubbed
场景中将这些
与特征一起使用,则必须在每种情况下使用正确的策略复制相关挂钩。目前还没有简单的方法说“使用与模型相同的策略添加一些关系”,尽管这也是我的愿望