Capybara + FactoryGirl,在形式上建立关系

时间:2016-07-19 17:37:55

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

我是FactoryGirl # App.rb belong_to :plan # Plan.rb has_many :apps 的新手,在我的Rails应用中,我的关系看起来像这样:

before_save :set_default_plan, on: :create

每个应用都必须有一个计划,在我的App.rb模型中,我这样做: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

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

#{app.plan.free_requests}

创建应用后,我在视图中呈现此内容:bundle exec rspec。如果我使用undefined method `free_requests' for nil:NilClass 运行我的测试,我目前会收到此错误:

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

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

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

set_default_plan

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

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

更新

这是# 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 方法的外观:

{{1}}

1 个答案:

答案 0 :(得分:2)

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