Meine sehr grundlegenden Feature-Spezifikationen werden zwar lokal gut weitergegeben, aber bei CircleCI und Codeship fehlgeschlagen. Die Tests, die fehlschlagen:Feature-Spezifikationen schlagen nur bei CircleCI- oder Codeship-Integrationsservices fehl
require 'spec_helper'
describe 'Authentication' do
describe "sign in" do
it "is the landing page for non-authenticated users" do
user = create(:user)
visit root_path
expect(page).to have_content 'LOG IN' # On sign-in page
fill_in 'Email', with: user.email
fill_in "Password", with: user.password
click_button 'Sign in'
expect(current_path).to eq user_path(user)
end
end
describe 'registration' do
it "allows new users to register" do
visit root_path
click_link 'Sign up'
fill_in 'Email', with: '[email protected]'
fill_in 'Password', with: 'password'
fill_in 'Password confirmation', with: 'password'
fill_in 'First name', with: 'John'
fill_in 'Last name', with: 'Doe'
click_button "Sign up"
expect(current_path).to include '/users/'
expect(page).to have_content "Welcome! You have signed up successfully."
end
end
end
Die Tests sowohl auf den ersten Zeilen nicht, wo sie die Erwartungen der Seiten festgelegt (expect(page).to have_content "LOG IN"
und click_link "Sign up"
, respectively), mit Fehlern der Seite HTML was darauf hindeutet, ist völlig leer:
expected to find text "LOG IN" in ""
Ich habe Screenshots auf CircleCI gespeichert und sie zeigen tatsächlich eine komplett leere Seite.
Hier wird es interessant. Ich habe versucht, das Problem durch running/watching the specs on Circle using a VNC zu debuggen. Als ich a)driver: :selenium
für die Tests eingestellt, b) ein sleep 1
oder zwei zu den Prüfungen hinzufügen, bevor Sie die Seite Erwartungen zu testen, und c) manuell den Test nach SSHing in ihre Server mit dem VNC laufen, kann ich Sehen Sie die Tests in Selenium (sie öffnen einen Browser in der VNC) und sie passen perfekt.
Außerhalb der VNC, jedoch die Tests in beiden CI-Servern konsistent fehlschlagen. Mit oder ohne Tonnen von sleep
s und driver: :selenium
. Irgendwelche Ideen, was diese Diskrepanz zwischen den regulären CircleCI/Codeship-Servern und ihrer VCN/meiner lokalen Testumgebung verursachen könnte? Ich habe mich mit den Leuten von CircleCI in Verbindung gesetzt, aber sie sind für den Moment ratlos.
Wenn relevant, ich bin mit Ruby-2.2.0, Rails 4.2, Capybara 2.4.4, Capybara-Webkit 1.4.1 und Selen-WebDriver 2.44.0
Einige potenziell relevante Dateien :
spec_helper.rb
ENV["RAILS_ENV"] = "test"
require File.expand_path("../../config/environment", __FILE__)
require "rspec/rails"
require "shoulda/matchers"
require "webmock/rspec"
require 'vcr'
Dir[Rails.root.join("spec/support/**/*.rb")].each { |file| require file }
module Features
include Warden::Test::Helpers
Warden.test_mode!
def sign_in(user)
login_as(user, scope: :user)
end
end
module Controllers
# Pre-parse controller responses for easy access
def response_body
body = JSON.parse(response.body)
body.is_a?(Hash) ? body.to_sh : body.map(&:to_sh)
end
end
module Mock
def disable_webmock(&block)
WebMock.disable!
yield
WebMock.enable!
end
end
RSpec.configure do |config|
config.expect_with :rspec do |c|
c.syntax = :expect
end
# Save a screenshot to CircleCI when a feature test fails
config.after(:each, :type => :feature) do |example|
if example.exception
artifact = save_page
puts "\"#{example.description}\" failed. Page saved to #{artifact}"
end
end
config.include Features, type: :feature
config.include Controllers, type: :controller
config.include Mock
config.include Formulaic::Dsl, type: :feature
config.infer_spec_type_from_file_location!
config.infer_base_class_for_anonymous_controllers = false
config.order = "random"
config.use_transactional_fixtures = false
end
RSpec::Matchers.define :hash_eq do |expected|
match do |actual|
actual.recursive_symbolize_keys == expected.recursive_symbolize_keys
end
end
VCR.configure do |c|
c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
c.hook_into :webmock
c.allow_http_connections_when_no_cassette = true
c.configure_rspec_metadata!
c.ignore_hosts '127.0.0.1', 'localhost:3000'
end
ActiveRecord::Migration.maintain_test_schema!
Capybara.javascript_driver = :webkit
if ENV['CIRCLE_ARTIFACTS']
Capybara.save_and_open_page_path = ENV['CIRCLE_ARTIFACTS']
end
WebMock.disable_net_connect!(allow_localhost: true)
database_cleaner.rb
RSpec.configure do |config|
config.use_transactional_fixtures = false
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
Dies könnte ein CircleCI-Konfigurationsproblem sein. Können Sie Ihre cicle.yml-Datei auch teilen? –
Verwenden Sie Headless oder einen Saas-Service? Die meisten dieser CI-Programme sind rein kopflos und können so etwas wie Selen ohne echte Arbeit nicht ausführen. – TIMBERings
Wenn Sie Selen verwenden, können Sie es mit Firefox 28.0 versuchen. – juanitofatas