如何从使用Capybara填充的数据库下拉列表中选择值



我有两个模型:场地和活动。Venue has_many:events和Event belongs_to:场地。

我的活动/新表单有以下字段

  • 日期(用当前日期填充)
  • 时间(用当前时间填充)
  • 标题(空)
  • 场馆(由开发数据库中的场馆表填充)

现在我正试图用RSpec和Capybara来测试这一点。这是我的功能:

require 'spec_helper'
feature "Events" do
let(:venue) { FactoryGirl.create(:venue) }
let(:event) { FactoryGirl.create(:event, venue: venue) }
scenario "Creating event as guest" do
visit root_path
click_link "Submit Event"
fill_in "Title", with: event.title
click_button "Submit"
expect(page).to have_content("Event has been created.")
expect(page).to have_content(event.title)
end
end

我的工厂是这样的:

FactoryGirl.define do
factory :event do
date "2014-02-27"
time "10:00am"
title "Slayer"
end
end
FactoryGirl.define do
factory :venue do
name "Example Venue"
url "http://www.example.com"
address "123 Main St., Chicago, IL"
end
end

当我运行这个规范时,我得到以下错误:

Failure/Error: click_button "Submit"
ActionView::Template::Error:
Couldn't find Venue without an ID

我猜这与测试环境中没有填充场馆字段有关?

使用let是懒惰的,所以您的数据库调用将在这里执行:

scenario "Creating event as guest" do
visit root_path
click_link "Submit Event"
fill_in "Title", with: event.title # <------------------- evaluated!
click_button "Submit"
expect(page).to have_content("Event has been created.")
expect(page).to have_content(event.title)
end

你可能想要的是:

feature "Events" do
background do
@event = FactoryGirl.create(:event, venue: FactoryGirl.create(:venue))
end
scenario "Creating event as guest" do
visit root_path
click_link "Submit Event"
fill_in "Title", with: @event.title
click_button "Submit"
expect(page).to have_content("Event has been created.")
expect(page).to have_content(@event.title)
end
end

您也可以使用直接执行的let!,但我认为设置块要清晰得多。

最新更新