我试图用Rspec / Capybara测试我的AJAX。
我的页面(招聘人员#dashboard)包含3列。
它适用于申请某个空缺及其州的候选人。
第1列=>状态==未决
第2列=>状态==匹配
第3栏==>状态=="密封"
在我的规范中,我创建了一个空缺职位,其中有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"
答案 0 :(得分:0)
执行js测试时,正在测试的应用程序运行在与测试不同的线程中,这意味着它们不再共享相同的数据库连接 - 请参阅https://github.com/jnicklas/capybara#transactions-and-database-setup。因此,您需要禁用事务测试并使用截断或删除来管理数据库状态。最简单的方法是使用database_cleaner并设置一个配置,该配置将交换到每个测试所需的策略 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example
一旦你正确配置了它,就可以看看你的测试,并通过异步测试使其不那么脆弱。
expect(current_path).to eq '/'
应改写为expect(page).to have_current_path('/')
,以便Capybara会自动等待页面更改。 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,:取决于您正在验证的内容使用正确的Capybara方法可以消除测试中大多数(如果不是全部)sleep()的需要。