【问题标题】:Capybara + FactoryGirl, set relationship in formCapybara + FactoryGirl,在表格中设置关系
【发布时间】:2016-07-19 17:37:54
【问题描述】:

我是Capybara FactoryGirl 的新手,在我的 Rails 应用程序中,我的关系如下所示:

# App.rb
belong_to :plan

# Plan.rb
has_many :apps

每个应用程序都必须有一个计划,在我的 App.rb 模型中,我这样做:before_save :set_default_plan, on: :create

我想使用 Capybara 集成测试来测试应用创建是否有效。我目前有一个看起来像这样的测试:

require "rails_helper"

include Warden::Test::Helpers
Warden.test_mode!

describe "adding apps" do

  let(:user) { FactoryGirl.create(:user) }
  before { login_as(user, scope: :user) }

  it "allows a user to create an app" do
    visit apps_path
    fill_in "App name", with: "My App"
    click_on "create_app_button"
    visit apps_path
    expect(page).to have_content("My App")
  end
end

创建应用程序后,我会在我的视图中呈现:#{app.plan.free_requests}。如果我使用 bundle exec rspec 运行测试,我目前会收到此错误:

undefined method `free_requests' for nil:NilClass

在我的应用程序中,我还使用 FactoryGirl 来测试我的模型。我有以下(相关)工厂:

FactoryGirl.define do
  factory :app do
    name "Test"
    [...]
    association :plan, :factory => :plan
  end
end

FactoryGirl.define do
  factory :plan do
    name "Default"
    [...]
  end
end 

我想知道我应该如何设置我的工厂和测试套件以使这个测试成为绿色测试。

我是否可以为我正在使用 Capybara 创建的应用程序分配一个计划,或者我可以使用 FactoryGirl 为我的应用程序创建一个默认关联/计划。还有另一种方法吗?感谢所有的帮助。

更新

这就是我的set_default_plan 方法的外观:

# App.rb
def set_default_plan
  if self.new_record?
    plan = Plan.find_by_stripe_id("default_plan")
    if plan.nil? == false
      self.plan = plan
    end
  end
end

【问题讨论】:

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


    【解决方案1】:

    FactoryGirl 真的不应该与您的测试中的“应用程序”或“计划”有任何关系,因为您正在运行您的控制器创建操作,除非set_default_plan 实际上没有创建计划(如果不存在)。如果是这种情况,那么您可以使用 FactoryGirl 在之前的块中创建所需的计划,例如 - FactoryGirl.create(:plan)

    您还应该指定计划是必需的关联(这是 Rails 5 中的默认设置,因此如果您使用它可能没有必要),这将防止在没有计划的情况下创建您的应用程序。

    # App.rb
    belongs_to :plan, required: true
    

    要注意的另一件事是,在单击执行操作的按钮后,您应该始终检查确认,然后再访问另一个页面。这是因为点击按钮的结果不保证是同步的,所以立即访问另一个页面可能会终止操作请求。

    click_on "create_app_button"
    expect(page).to have_content("App Created!!!")  # whatever text is shown on success
    visit apps_path
    

    【讨论】:

    • 谢谢!我确实使用 Rails 5。我尝试更改并检查确认而不是应用程序名称。但是我仍然有我最初的问题,即测试抱怨我的应用程序计划为零。 set_default_plan 如果没有计划,则不会创建计划。关于如何解决我的零计划问题的任何想法?
    • @Anders 因此,如果它不创建新计划,它如何知道与应用关联的计划?也许将您的 set_default_plan 代码添加到问题中
    • 我现在已将其添加到我的问题中。
    • 好的 - 所以你需要创建一个与该 stripe_id 匹配的计划 - 在你的 before 块中类似于 FactoryGirl.create(:plan, stripe_id: 'getlingo_default')。另外 - 如果一个应用程序必须有一个计划,如果找不到默认计划,你可能不想什么都不做 - 所以你可能想要做 Plan.find_by_stripe_id!("getlingo_default") 代替(!所以如果计划不存在)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多