Moje bardzo proste specyfikacje funkcji przechodzą dobrze, ale lokalnie, ale zawieszają się w CircleCI i Codeship. Testy, które są upadające:Specyfikacja funkcji kończy się niepowodzeniem tylko w przypadku usług ciągłej integracji CircleCI lub Codeship
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
testów zarówno zawieść na pierwszych liniach gdzie określonych oczekiwań stron (expect(page).to have_content "LOG IN"
i click_link "Sign up"
, odpowiednio), z błędów sugerujących HTML strony jest całkowicie pusta:
expected to find text "LOG IN" in ""
Zapisałem zrzuty ekranu w CircleCI i rzeczywiście pokazują całkowicie pustą stronę.
Oto, gdzie to staje się interesujące. Próbowałem debugowania problemu przez running/watching the specs on Circle using a VNC. Kiedy a) ustawić driver: :selenium
Do testów b) dodać sleep 1
lub dwa do testów przed badaniem oczekiwania stron, a c) ręcznie uruchomić test po SSHing na swoich serwerach z VNC, mogę zobacz testy uruchomione w Selenium (otwierają przeglądarkę w VNC) i przechodzą perfekcyjnie.
Jednak poza VNC testy kończą się niepowodzeniem w obu serwerach CI. Z lub bez ton sleep
s i driver: :selenium
. Jakieś pomysły, które mogą powodować tę rozbieżność między zwykłymi serwerami CircleCI/Codeship a ich VCN/moim lokalnym środowiskiem testowym? Skontaktowałem się z ludźmi z CircleCI, ale oni są na moment zaskoczeni.
stosownych przypadkach, biegnę Ruby 2.2.0, Rails 4.2, 2.4.4 Kapibara, Kapibara-Webkit 1.4.1 i selen Webdriver 2.44.0
Niektóre potencjalnie odpowiednie pliki :
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
Może to być problem z konfiguracją CircleCI. Czy możesz również udostępnić swój plik cicle.yml? –
Czy korzystasz z usługi bezgłowej lub usługi Saas? Większość z tych programów CI jest czysto bezgłowych i nie można uruchomić czegoś takiego jak selen bez jakiejś prawdziwej pracy. – TIMBERings
Jeśli używasz selenu, możesz wypróbować przeglądarkę Firefox 28.0. – juanitofatas