rspec / capybara <li>未加载

时间:2016-02-22 09:45:17

标签: ruby-on-rails rspec capybara

我试图用Rspec / Capybara测试我的AJAX。

我的页面(招聘人员#dashboard)包含3列。

它适用于申请某个空缺及其州的候选人。

第1列=&gt;状态==未决

第2列=&gt;状态==匹配

第3栏==&gt;状态==&#34;密封&#34;

在我的规范中,我创建了一个空缺职位,其中有1名申请人处于待定状态。

<input type="button" name="myButton" id="myButton" class="myButton" 
  onclick="myButtonOnClick()"
  value="Click Me!"></input>
  
  <input type="button" name="toggleButton" id="toggleButton" class="toggleButton"
    onclick="toggleButtonClick()"
    value="Toggle the other button"></input>

返回

print "Amount of vacancies => #{Vacancy.count} "
print "Amount of candidates => #{Employee.count} "
print "Amount of candidates applied for vacancy => #{Matching.where(vacancy_id: Vacancy.first.id).count}"
print "State of #{Employee.first.name} for #{Vacancy.first.name} => #{Matching.where(vacancy_id: Vacancy.first.id, employee_id: Employee.first.id).first.state}"

这意味着这个候选人应该加载到下面的li中:

Amount of vacancies => 1
Amount of candidates => 1
Amount of candidates applied for vacancy => 1
State of foo1 Hintz for vacancy1 => pending

然而,当我进行测试时:

<ul id="applied-desktop-dashboard-ajax">
  <li>
    CANDIDATES
  </li>
</ul>

返回

page.all("#applied-desktop-dashboard-ajax li").count.should eql(1)

当我

expected: 1
got: 0

我看到李是空的。

所以我试过

 save_and_open_page

sleep(5)

但没有成功。

有没有人知道为什么我的李在这个测试中没有加载(但是正在使用localhost就好了。)

完整测试:

visit "dashboard"

1 个答案:

答案 0 :(得分:0)

执行js测试时,正在测试的应用程序运行在与测试不同的线程中,这意味着它们不再共享相同的数据库连接 - 请参阅https://github.com/jnicklas/capybara#transactions-and-database-setup。因此,您需要禁用事务测试并使用截断或删除来管理数据库状态。最简单的方法是使用database_cleaner并设置一个配置,该配置将交换到每个测试所需的策略 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example

一旦你正确配置了它,就可以看看你的测试,并通过异步测试使其不那么脆弱。

  1. expect(current_path).to eq '/'应改写为expect(page).to have_current_path('/'),以便Capybara会自动等待页面更改。
  2. 默认情况下,page.all不会等待任何元素出现,因为0个元素是有效的返回。如果您将page.all("#applied-desktop-dashboard-ajax li").count.should eql(1)更改为expect(page).to have_selector("#applied-desktop-dashboard-ajax li", count: 1),Capybara会等待一段时间让li出现在页面上而不是立即失败,因为ajax尚未完成。您还可以指定:minimum,:maximum,:取决于您正在验证的内容
  3. 使用正确的Capybara方法可以消除测试中大多数(如果不是全部)sleep()的需要。