2017-12-18 162 views
0

我的應用程序有很多不同的地方,當用戶點擊按鈕/鏈接/ div時,我通過調用ajax函數來更新數據庫。我需要在測試中包含這些功能,但我對水豚的瞭解還不夠。在Capybara測試期間調用Coffeescript

下面是我想測試的一個div的示例,關聯的ajax調用以及我想要通過的測試。我應該補充一點,我正在通過Cloud9 IDE進行構建,以防有所作爲。

查看

<% @seminar.students.order(:last_name).in_groups_of(6).each do |group| %> 
    <div class="row"> 
     <% group.each do |student| %> 
      <% if student %> 
       <% this_ss = @seminar.seminar_students.find_by(:user => student) %> 
        <% if this_ss.present %> 
         <% thisClass = "col-md-2 seat clickySeat" %> 
         <% thisText = "Present" %> 
        <% else %> 
         <% thisClass = "col-md-2 seat clickySeat absent" %> 
         <% thisText = "Absent" %> 
        <% end %> 
        <div class = "<%= thisClass %>" id="<%= this_ss.id %>" name="ss_<%= this_ss.id %>"> 
         <%= student.first_plus_init %><br/> 
         <p class="presentTag"><%= thisText %></p> 
        </div> 
       <% end %> 
     <% end %> 
    </div> 
<% end %> 

CoffeeScript的

if $('.clickySeat').length > 0 
    $('.clickySeat').on "click", -> 
     this_tag = $(this).find(".presentTag") 
     seminar_student_id = $(this).attr('id') 
     url = '/seminar_students/'+seminar_student_id 
     if this_tag.text() == "Absent" 
      attendance = true 
      $(this).removeClass("absent") 
      this_tab.text("Present") 
     else 
      attendance = false 
      $(this).addClass("absent") 
      this_tab.text("Absent") 
     $.ajax 
      type: "PUT", 
      url: url, 
      dataType: "json" 
      data: 
       seminar_student: 
        present: attendance 

測試

test "attendance with click" do 
    @ss = @student_3.seminar_students.find_by(:seminar => @seminar) 
    assert @ss.present 

    capybara_login(@teacher_1) 
    click_on("desk_consult_#{@seminar.id}") 
    click_on("#{new_consultancy_button_text}") 
    find("##{@ss.id}").click 

    assert_not @ss.present 
    click_on("Create Desk Consultants Groups") 
end 

在開發和生產, divs和ajax正在努力切換數據庫中被標記爲不存在/存在的學生。但在測試中,assert_not @ ss.present行失敗。這是我試圖解決的模式:我的水豚測試都沒有調用任何JavaScript。

我已閱讀了幾個類似的問題和相關文章。我嘗試了迄今爲止閱讀過的所有建議,例如添加selenium-webkit gem,以便可以使用Capybara.javascript-driver =:selenium這一行。迄今爲止我遇到的解決方案都沒有爲我工作。

非常感謝您的任何見解。

+0

您不會告訴我們您想要通過的測試實際失敗。另外,當您設置「Capybara.javascript_driver」時,它只會被您指定使用支持javascript的驅動程序的測試使用。請參閱 - https://github.com/teamcapybara/capybara#selecting-the-driver。您應該能夠判斷它是否使用硒,因爲它通常會打開Firefox或Chrome的實例(具體取決於您的配置)。 –

+0

啊哈。好點子。測試在線assert_not @ ss.present上失敗。在開發和生產中,單擊div更新數據庫以在缺席和現在之間切換學生。在測試中,沒有任何反應。 –

+0

這是我試圖在任何地方修正的模式:我的水豚測試都沒有調用任何JavaScript。 –

回答

1

無運行JS你的測試通常是兩個問題中的一個,然後有你的測試另外兩個問題,可能會導致故障的不止於此。

對於JS問題,第一個原因可能是你的JS資源中有一個錯誤這導致它們在串聯在一起時不被處理。既然你聲明它在生產模式下工作(在連接也發生的地方),我們應該能夠規定這一點。第二個原因是您沒有使用支持JS的驅動程序。確保您已按照README - https://github.com/teamcapybara/capybara#using-capybara-with-minitest中的說明 - 從ActionDispatch :: IntegrationTest派生您的測試類,並且在任何需要JS的測試之前運行該部分的最後部分(其中Capybara.current_driver = Capybara.javascript_driver) 。 (如果你想讓所有的測試運行JS支持,你可以在設置Capybara.javascript_driver後設置Capybara.default_driver = Capybara.javascript_driver)。如果使用Rails 5.1 <你可能還需要安裝和配置database_cleaner - 見https://github.com/teamcapybara/capybara#transactions-and-database-setup

這應該讓你的測試用JS能驅動運行 - 超出 - 首先:當你打電話find(...).click未保證等待由點擊完成的任何操作。這意味着你需要設置一個斷言(由於它們具有等待/重試行爲而提供的斷言,因爲點擊觸發的可見變化),以確保它在嘗試從數據庫訪問元素之前完成了斷言。
其次:因爲您已經加載了@ss它不會反映數據庫狀態的變化,直到您重新加載對象。

在一起,這意味着你的測試將需要沿着

test "attendance with click" do 
    @ss = @student_3.seminar_students.find_by(:seminar => @seminar) 
    assert @ss.present 

    capybara_login(@teacher_1) 
    click_on("desk_consult_#{@seminar.id}") 
    click_on("#{new_consultancy_button_text}") 
    find("##{@ss.id}").click 
    assert_text("You are marked as absent") # An assertion for whatever visible change occurs due to the previous click which will delay the next statement until the app has completed processing 
    assert_not @ss.reload.present # Need to reload the object to see any DB changes 
    click_on("Create Desk Consultants Groups") 
end 

需要的線路更改爲重新加載對象所有的時間是上DB對象做斷言是在一般不贊成的原因之一,而你應該主要是測試UI行爲/更改(在功能測試中)

+0

我認爲我已經實施了所有的建議。現在看起來測試文件中的代碼無法訪問燈具。如果我將「調試器」放在測試文件中,User.count將返回零。 (這是因爲database_cleaner已經「清除」了所有的數據?)爲了解決問題,我試着在測試開始時創建一個新老師。不幸的是,這位新創建的老師無法登錄。當「調試器」被放置在我的sessions_controller中時,User.count將返回所有來自燈具的124個用戶。但它不包括我在測試中創建的老師。 –

+0

當我在沒有清理器的情況下嘗試時,出現以下錯誤:ActiveRecord :: StatementInvalid:SQLite3 :: BusyException:數據庫被鎖定: –

+0

@JeffZivkovic您尚未闡明您正在使用的Rails版本,但如果使用<5.1 (5.1+中不需要database_cleaner),並且您無法訪問在測試中創建的記錄,那麼最有可能意味着在運行支持JS的測試時,您沒有正確啓用database_cleaner以使用截斷或刪除模式,並且而是仍然使用交易模式。 –

1

您可以嘗試Poltergeist驅動程序並更改配置以使用它。不要忘了在你的路上安裝PhantomJS(你可以使用以下命令安裝它:npm install -g phantomjs

你應該在測試的某些部分添加js: true,我只是不記得在哪裏。一下吧。=]

祝你好運。

+1

'js:true'只有在使用RSpec時纔有效 - OP似乎正在使用minitest。 –

+0

如果我能弄清楚如何安裝phantomjs,它是否可以與Minitest一起使用?使用Cloud9 IDE會有所作爲嗎? –