为什么rspec没有等到完成上一个命令?

时间:2015-03-25 23:36:52

标签: ruby-on-rails backbone.js rspec capybara poltergeist

我的rails-app包含使用Capybara poltergeist(使用phantomjs)的rspec测试。前端是Backbone.js。有时会通过某些测试,有时则不会。调试显示在检查时未加载正确的内容。如果我添加一个延迟,电子邮件。睡觉(inspection_time = 1),然后测试通过。

  describe 'Direct visit page / # / desk / page / [ID]' do
    before {sign_in user}
    it 'should contain page title' do
      visit "/#/desk/pages/#{page.id}"
      #sleep (inspection_time = 1)
      expect (page) .to have_css (". page-detail p.title",: text => page.title)
    end
  end

执行js-tests并且这么长,但不可靠的延迟会增加执行时间。是否有一个很好的解决方案的司机恶作剧(宝石' poltergeist',' 1.6.0')?

可能值得抛弃顽固主义者,例如capybara-webkit?

1 个答案:

答案 0 :(得分:2)

使用capybara测试异步请求可能会非常棘手。你注意到capybara不知道等待异步请求完成。但好消息是,匹配者足够聪明,可以等待某些事情出现。

例如,如果你打电话

expect(page).to have_css(".new_data")

并且最初不存在具有new_data类的div,capybara将等待X秒(在配置中定义)以查看它是否出现。然而,这有时是不够的,你可能正在处理某种竞争条件。 Thoughtbot写了一篇关于如何解决这个问题的好article