有一部分BDD,我真的很困惑。我有各种不同的要求规格需要测试。结构如下:
我对如何使用FactoryGirl建立工厂感到困惑。我熟悉联想和特质的概念。我熟悉build和create的概念。但我不确定在什么情况下使用这些。
我最能表达困惑的方法就是举几个例子。
User注册的请求规范。我不是因为明显的原因而在这里使用工厂。这我能理解。User的Products。我create一个用户工厂。我假设这里需要使用create而不是build,因为ProductsController中的CRUD方法对通过URL传递的id执行AR find。如果我错了就纠正我。PriceLevels添加不同的Product。这里我使用两个工厂:User和Product。User's Product's PriceLevel添加不同的Product。现在,我有多达3家工厂:User,Product,PriceLevel。现在,如果Price有一个带有类似Currency的东西的has_and_belongs_to_many怎么办?工厂正在失控。
我会说,当我到达PriceLevel时,我想要一个工厂,它可以让我立即创建整个结构。然而,我不想每次创建一个完整的结构()。此外,这些工厂可以自下而上或自上而下创建。
哪种方式更好,自下而上还是自上而下?我可以创建干代码,为我提供一个工厂的选项,或者一次性创建整个系统吗?我能用特征包装after(:create)块吗?我会在请求规范中使用build vs create吗?
非常感谢您的关注!
发布于 2014-01-09 19:07:26
首先,请求规范中的build与create:
我通常在控制器规范中使用build或build_stubbed,通过阻塞Model.find来返回构建的实例。但是,在特性或请求规范中应该避免一般的嘲弄,所以请继续在这里使用create。
至于主要的问题:
这听起来是个完美的特征案例。一般来说,基本工厂应该只具有建立有效模型所需的属性。然后,特征可以用来为常见或冗长的场景制作方便的“别名”。
您可以使用before(: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如果您想自定义在构建时添加了多少产品/价格,您只需添加ignored属性并通过前挂钩的2参数形式使用它们。
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场景中使用这些特性,则必须在每种情况下使用正确的策略复制相关的钩子。目前还没有一个简单的方法可以说“使用与模型相同的策略添加一些关系”,尽管这也是我自己的愿望清单。
https://stackoverflow.com/questions/21028538
复制相似问题