2014-02-27 59 views
0

我有2個模型:場地和事件。場地has_many:賽事和賽事belongs_to:場地。如何從數據庫填充下拉菜單中選擇一個值與Capybara?

我的活動/新形式有以下字段

  • 日期(填入當前日期)
  • 時間(填充當前時間)
  • 標題(空)
  • 地點(填入來自開發數據庫的場地表)

現在我試圖用RSpec和水豚來測試它。這是我的特點:

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 

我猜這有事這是否與Venue字段未在測試環境中填充有關?

回答

2

使用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!直接執行,但我認爲設置塊更清晰。

+0

這讓我絆倒了很多時間...... – sevenseacat

+0

好吧,那有效。但讓和讓的區別究竟是什麼!? – mikeglaz

+0

讓< - 懶惰讓! < - 不懶 – phoet

相關問題