升级到Rails 4.2打破rspec功能规范 - 为什么?

时间:2014-12-22 18:30:38

标签: ruby-on-rails rspec capybara

我的模型和控制器规格运行正常,但在升级到rails 4.2之后,我使用Capybara的功​​能规格不再有效。例如:

#in spec_helper.rb:
def login_admin
  create(:user,
         first_name: 'John',
         last_name: 'Doe',
         email: 'doej@test.com',
         admin: true)

  visit root_path
  fill_in 'email', with: 'doej@test.com'
  fill_in 'password', with: 'password1'
  click_button 'Log in'
  puts 'created'
end

#in spec/features/albums_spec.rb
feature "Albums", :type => :feature do
  before(:each) do
    login_admin
  end

  scenario 'do something' do
    save_and_open_page
  end
end

当我运行此规范时,它永远不会完成,无论是通过还是失败。没有错误;它只是坐在那里,用下方的光标显示专辑。 '创建'永远不会被放到stdout,并且页面永远不会被save_and_open_page调用启动。测试日志显示我的登录操作呈现的erb文件。这一切都在rails 4.2升级之前完成。

这仅在规范运行期间失败 - 在浏览器中使用该应用程序正常工作。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

更新:与capybara / rspec相关的可能问题:

  1. 避免在要素规范中创建模型,因为它们是在不同的线程中创建的。相反,使用水豚步骤创建用户(即"注册"每次用户)。

  2. 如果您真的需要为点击场景而无法创建的数据库,请实施一个简单的" admin"您应用中的区域(您可能还需要一个)或管理API界面或类似CSV上传选项等。

  3. 否则,您可以搜索" capybara rspec database_cleaner append_after"对于支持在特征规范中创建模型的设置,但我发现没有一个解决方案真的是防弹的。您可以尝试:https://github.com/RailsApps/rails_apps_testing

  4. 我猜你的例子是/被卡在数据库操作上(等待其他线程中的数据库连接结束)。

    以前的答案:

    一些想法:

    1. 在login_admin方法中捕获异常并使用STDERR.puts
    2. 将其打印出来
    3. 删除click_button并查看它是否按预期失败(显示登录页面)
    4. 中输入密码后添加sleep 4
    5. 将click_button分成2个调用(查看哪个挂起):

      btn = find(:button, locator, options)
      STDERR.puts "found: #{btn.inspect}"
      btn.click 
      
    6. 使用bundle show capybara查找它的位置,编辑查找(或点击)方法并在其中输入STDERR.puts方法以查看错误