【问题标题】:Seed-like records in rspec and Factory Girlrspec 和 Factory Girl 中的类似种子的记录
【发布时间】:2014-09-19 02:24:19
【问题描述】:

我知道播种测试数据库是一种bad idea。 我需要在我的模型测试中测试Stripe api 通信。我知道单元测试中的外部请求也是一个坏主意,但尽管如此。

条带帐户具有静态订阅计划名称。因此,当我测试与 Stripe 链接的功能时,我需要从我的数据库中获取它们。我使用 Factory girl gem 作为固定源,但由于我只需要 Stripe 计划的特定名称,因此我将它们硬编码到工厂:

  factory :subscription_type do
    name "Personal"
    frequency "month"
    stripe_plan_id "personal"
  end

使用这个的其他工厂每次都尝试创建具有相同字段值的新对象,并且由于对 subscription_type 模型的唯一性验证,工厂会抛出错误。如果在一个示例中调用它们,我希望它们都使用相同的记录(如果存在)。

各位,这里的最佳做法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby rspec factory-bot


    【解决方案1】:

    为什么不使用sequence(:unique_field) {|n| "unique_field #{n}"},这将使变量n具有顺序,然后字段将是唯一的。

    【讨论】:

    • 我关心的不是唯一性:我需要相反的技术。
    • 我只需要一个跨所有工厂的 subscription_type 对象实例。所以他们不会每次都创建新的唯一订阅类型
    【解决方案2】:

    如果您只想拥有一个 subscription_type 对象,请先尝试创建它,然后将其作为参数传递给其他工厂:

    @subscription_type = FactoryGirl.create :subscription_type
    
    @other_object = FactoryGirl.create :other_object, subscription_type: @subscription_type
    

    您也可以尝试为您的工厂定义一个智能关系,用于检查之前是否存在订阅类型:

    FactoryGirl.define do 
        factory :user do
          subscription_type { SubscriptionType.first.present? ? SubscriptionType.first : FactoryGirl.create(:subscription_type) }
        end
    end
    

    【讨论】:

    • 是的,这会解决问题,但价格有点高:您必须通过自己的测试来关心@subscription_type 的唯一性。我希望工厂级解决方案
    • 是的,这很简单,似乎是一个解决方案。傻我,谢谢试用。
    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多