【问题标题】:Specs pass locally, but fail for Travis CI规范在本地通过,但 Travis CI 失败
【发布时间】:2015-06-21 03:07:04
【问题描述】:

我编写了一些功能规范来测试通过我的 rails 应用程序登录,并且这些规范都在本地通过,但是当 Travis CI 运行它们时它们失败了。这是一个例子:

1) User Registration User signs up with valid credentials
     Failure/Error: fill_in 'Username', with: 'dannnnneh'
     Capybara::ElementNotFound:
       Unable to find field "Username"
     # ./spec/features/registrations_controller_spec.rb:8:in `block (2 levels) in <top (required)>'

我阅读了common build problems for Travis CI 以使用Capybara.default_wait_time = 15;但是,我要么把它放在错误的地方,要么它不起作用。

示例规范:

scenario 'User signs up with valid credentials' do
    Capybara.default_wait_time = 15
    visit '/users/sign_up'
    fill_in 'Username', with: 'dannnnneh'
    ...

编辑:

我也尝试将Capybara.default_wait_time = 15 放入rails_helper.rbspec_helper.rbspec/support/capybara.rb

由于this SO 问题,我还将以下内容添加到.travis.yml

script:
    - xvfb-run bundle exec rspec spec/features/*.rb

但是,这也不起作用。

有谁知道问题可能是什么或如何解决?

编辑:

这是我的spec_helper.rb

require 'simplecov'
SimpleCov.start


require 'capybara'
require 'capybara/poltergeist'

Capybara.javascript_driver = :poltergeist
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, timeout: 15)
end

RSpec.configure do |config|

  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end

end

【问题讨论】:

  • 您使用的是什么驱动程序?该页面上是否运行了任何可能使登录框出现的 javascript?
  • @DickieBoy 我没有使用驱动程序,我需要一个吗?
  • 我相信我已经将它设置为使用 Poltergeist,但仍然没有运气。
  • 您是否在 travis 上的测试脚本中使用 bundle install
  • 所有包都会在 travis 运行时自动安装。

标签: ruby-on-rails ruby rspec capybara travis-ci


【解决方案1】:

你能发布你的 spec_helper 吗?另外,官方文档建议了另一种配置xvfb的方法,你检查过http://docs.travis-ci.com/user/gui-and-headless-browsers/吗?

【讨论】:

  • 我发布了我的规范助手
  • 通常,我用“xvfb-run -a”开始我的水豚测试。你可以试试吗?
  • 感谢 jiop 的帮助!我已经发布了正确的解决方案。
  • 作者没有提到他需要GUI,因此建议将configure xvfb 设置为没有意义。使用无头浏览器时不需要。
【解决方案2】:

检查 TrevisCI 是否可以创建测试数据库。 为了使用 Travis CI,我必须创建 TravisCI 可以使用的 public test DB...

【讨论】:

  • 我不认为这是问题所在,因为只有功能规范在我实际访问网页时失败。
  • 当我将测试数据库移至 Amazon RDS 时,我在 TravisCI 上的 RSpec 开始正常工作...
【解决方案3】:

您有一些问题或其他问题,但没有调试输出,因此很难判断出了什么问题。我将通过更改您的测试来为您提供该输出,从而一一消除这些问题。你可以有以下之一(或其他):

  • 您可能不在正确的页面上,因为导航失败
  • 除了错误消息之外,您的页面上可能没有任何内容
  • 您可能在页面上有其他内容覆盖了用户名字段

尝试添加验证您所在页面的步骤:

expect(page).to have_current_path('/users/sign_up')

或者尝试添加一个打印页面 HTML 的步骤。

puts page.html

如果不是……

fail page.html

你应该找到一些有用的东西来告诉你为什么看不到要填写的输入。

【讨论】:

  • 我添加了expect(current_path).to eq '/users/sign_up' 并没有触发错误。但是,当我puts page.html 时,它看起来并没有渲染部分,因为它显示了= render "layouts/shared/side_bar"= render "layouts/shared/header"= render "layouts/shared/body" 你认为问题可能是我使用的是 slim 吗?
  • 这帮助我找到了解决方案,所以我奖励了你。
  • @Dbz 谢谢!很高兴我能帮上忙。
  • 不要use expect(current_path)... 否则你的测试会随机失败。始终使用expect(page).to have_current_path('/users/sign_up') 给浏览器/werbserver 等待时间来完成它们的工作。
【解决方案4】:

travis CI 失败的原因是application.js 中的require_tree 存在问题。如果require_tree 引用的目录是空的,那么一切都会中断。我找到了三种解决方案。

1) 将.keep 文件添加到正确的目录

2) 删除 require_tree 语句和任何使用它的东西

3) 删除使用require_tree 语句的所有内容。

就我而言,是涡轮链接导致了问题。我打算实现一个前端框架,所以我删除了application.html.slim中对turbo-links的引用

Travis CI 仅在我从 slim 切换到 erb 时才吐出此错误,而在我的一个测试中 puts page.html,因此很难追踪。

【讨论】:

    猜你喜欢
    • 2012-12-17
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    相关资源
    最近更新 更多