2012-12-13 66 views
0

我一直在撞牆我試圖找出爲什麼這個測試沒有通過Rspec。它在瀏覽器中工作。Capybara :: ElementNotFound在下拉選擇使用Rspec

我有一門課程表,屬於成績對象。在課程的形式,有一個選擇框,讓用戶選擇等級:

<%= form_for [current_user, @course] do |course| %> 
... 
<%= course.label :grade_id, "What age are the students?" %> 
<%= course.collection_select(:grade_id, Grade.all, :id, :grade_level, options ={:prompt => "Select Grade"}) %> 

我在Rspec的測試看起來是這樣的:

describe "A workign form" do 
    before do 
    sign_in_via_form #signs the user in 
    visit new_user_course_path(@user) #references @user, defined in Helper 
    end 
let(:course){@user.courses} 

    context "With valid information" do 
    it "adds a course" do 
     expect { 
     fill_in 'course_name', with:'Course Name' 
     select 'Fall', from: 'course_course_semester' 
     select '2012', from: 'course_course_year' 
     select 'Grade 5', from: 'course_grade_id' 
     fill_in 'course_summary', with: 'Perfunctory Summary' 
     fill_in 'course_objectives_attributes_0_objective', with: "an objective" 
     click_button "submit" 
    }.to change(course, :count).by(1) 
    end 
    end 
...#other tests 
end #describe block 

在我的形式生成的HTML如下:

<label for="course_grade_id">What age are the students?</label> 
<select id="course_grade_id" name="course[grade_id]"><option value="">Select Grade</option> 
    <option value="1">Kindergarten</option> 
    <option value="2">Grade 1</option> 
    <option value="3">Grade 2</option> 
    <option value="4">Grade 3</option> 
    <option value="5">Grade 4</option> 
    <option value="6">Grade 5</option> 
    <option value="7">Grade 6</option> 
    <option value="8">Grade 7</option> 
    <option value="9">Grade 8</option> 
    <option value="10">Grade 9</option> 
    <option value="11">Grade 10</option> 
    <option value="12">Grade 11</option> 
    <option value="13">Grade 12</option> 
    <option value="14">High School</option> 
</select> 

讓我知道是否有其他代碼需要;我非常樂意提供它。我的其他選擇框正在工作,但它們也是陣列驅動內容的模型的一部分。但是,在這種情況下,相關模型正在驅動內容。我不確定這是否重要,如果有的話。

+0

你有測試前填充的成績? – dimuch

+0

我不確定......成績在單獨的表格中,成績,這是collection_select中的值來自哪裏。我的考試中沒有明確的成績。我應該添加他們的地方?哪裏? – jflores

回答

3

下拉列表中的數據來自數據庫。 Rails使用單獨的數據庫進行測試,默認情況下它的表爲空。所以你需要填寫成績表,以便在下拉列表中有一些選項。

隨着FactoryGirl它可以看起來像

FactoryGirl.define do 
    factory :grade do 
    sequence(:grade_level) { |n| "Grade #{n}" } 
    end 
end 

而且測試

describe "A workign form" do 
    before do 
    sign_in_via_form #signs the user in 
    FactoryGirl.create_list(:grade, 14) # fill the grades table before visit the page 
    visit new_user_course_path(@user) #references @user, defined in Helper 
    end 
    ... 
+0

非常感謝您指點我這個方向;我沒有意識到數據庫是如何在測試環境中工作的,並且在實現這個過程中查看日誌非常有幫助。 – jflores

+1

謹慎的一句話(對於那些可能會看到解決同樣問題的人來說),這個方法會不斷地通過你的每個例子遞增序列。爲了重置每個測試的序列,我在(:each)塊之後使用了FactoryGirl.reload。根據這篇文章:http://stackoverflow.com/questions/3359168/how-can-i-reset-a-factory-girl-sequence這是一個「反模式」,但它現在爲我工作。 – jflores

+0

jflores建議使用'FactoryGirl.reload'+1。在一個側面說明中,幫助我解決這個時間問題的一個工具是'launchy'寶石。您可以在測試執行的各個部分拋棄'save_and_open_page',並查看視圖的collection_select何時/是否已填充。 – wintondeshong

相關問題