2017-10-19 23 views
0

J'ai une spécification qui passe mais lorsque j'ajoute js: true échoue.Chrome sans tête avec la connexion de base de données Rspec ne fonctionne pas

échoue car avant visit survey_path(survey) il y a un survey et un account alors il tente d'exécuter cette ligne visit survey_path(survey) et je reçois undefined method surveys for nil:NilClass parce qu'il n'y a pas de compte ou d'une enquête. C'est comme si tout était supprimé de la base de données.

J'ai un composant de réaction à l'intérieur de la vue, donc je veux écrire des spécifications de fonctionnalités pour cela, d'où la raison pour laquelle j'ai besoin js: true.

Quelqu'un sait pourquoi la base de données ne dispose pas d'un sondage et d'un compte quand j'ai js: true?

describe '#edit', js: true do 
    let(:new_survey_name) { 'new survey name' } 

    context 'authenticated user' do 
     before do 
     login_as user 

     # Here there is an account and survey. 
     # Then inside the code when Survey#show is hit there is 
     # no account or survey 
     visit survey_path(survey) 
     end 

     it 'can edit survey' do 
     click_link 'Settings' 
     fill_in 'survey[name]', with: new_survey_name 

     click_button 'Save' 
     visit survey_path(survey) 
     expect(page).to have_content(new_survey_name) 
     expect(page).not_to have_content('Status') 
     end 
    end 

Le fichier d'aide de rails a ce à l'intérieur

RSpec.configure do |config| 
    config.include FactoryGirl::Syntax::Methods 
    config.use_transactional_fixtures = true 
    config.infer_spec_type_from_file_location! 
    config.filter_rails_from_backtrace! 
    config.include RequestSpecHelper, type: :request 

    config.include Warden::Test::Helpers 

    config.use_transactional_fixtures = false 

    config.before(:each) do 
    DatabaseCleaner.strategy = :transaction 
    end 

    config.around(:each) do |example| 
    DatabaseCleaner.cleaning do 
     example.run 
    end 
    end 

    config.before(:suite) do 
    begin 
     DatabaseCleaner.clean_with(:truncation) 
    ensure 
     DatabaseCleaner.clean 
    end 
    end 
end 


Capybara.register_driver :chrome do |app| 
    Capybara::Selenium::Driver.new(app, browser: :chrome) 
end 

Capybara.register_driver :headless_chrome do |app| 
    capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
    chromeOptions: { 
     args: %w(headless disable-gpu) 
    } 
) 

    Capybara::Selenium::Driver.new app, 
    browser: :chrome, 
    desired_capabilities: capabilities 
end 

Capybara.configure do |config| 
    config.default_max_wait_time = 5 
    config.javascript_driver = :headless_chrome 
    config.server_host = 'localhost' 
    config.server_port = 54_321 
end 

Répondre

1

Lorsque vous utilisez des tests de fonctionnalité, il est recommandé d'utiliser :truncation méthode propre. Il suffit d'ajouter quelque chose comme ceci à votre config database_cleaner:

config.before(:each, type: :feature) do 
    driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test 

    DatabaseCleaner.strategy = :truncation if !driver_shares_db_connection_with_specs 
end 

Source: https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example