Ruby on rails 3 对于如何使用FactoryGirl构造嵌套模型,是否有Rails约定?
BDD中有一部分我真的很困惑。我有各种不同的要求规格测试。结构如下: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而不是
- 用户有很多产品
- 产品有许多价格等级
- 价格水平有很多价格
build
和create
的概念。但我不确定在什么情况下使用这些
我能说出我所困惑的事情的最好方法就是举一些例子
- 我有一个测试
用户注册的请求规范。我在这里不使用工厂,原因很明显。这我理解
- 我有一个测试
创建新的用户的请求规范
。我创建一个用户工厂。我假设我需要在这里使用产品
而不是create
,因为build
中的CRUD方法对通过URL传递的id执行ARProductsController
。如果我错了,请纠正我find
- 我有一个请求规范,用于测试为
产品添加不同的
。这里我使用两个工厂:价格级别
和用户
产品
- 我有一个请求规范,用于测试为
用户
产品
的
价格级别
添加不同的
价格。现在我有3家工厂:
,用户
,产品
价格水平
Price
有一个has\u,并且\u属于\u many
,比如Currency
?工厂正在失去控制
我想说,当我到达PriceLevel
时,我想要一个工厂,它可以让我一次创建整个结构。但是,我不想每次都创建整个结构。此外,这些工厂可以自下而上或自上而下创建
自下而上还是自上而下,哪种方式更好?我可以创建一个简单的代码,让我可以选择一个工厂还是一次创建整个shebang?我可以在traits中的(:create)块之后包装?我会在请求规范中使用build
vscreate
非常感谢您的关注 首先,build
vscreate
在请求规范中:
我通常在控制器规范中通过stubingModel使用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
场景中将这些与特征一起使用,则必须在每种情况下使用正确的策略复制相关挂钩。目前还没有简单的方法说“使用与模型相同的策略添加一些关系”,尽管这也是我的愿望