2012-03-13 7 views
10

हाय दोस्तों मैं capybara में फ़ाइल डाउनलोड का परीक्षण करना चाहता हूँ।rspec 1.3.0/capybara 0.3.9/सेलेनियम के साथ फ़ाइल डाउनलोड का परीक्षण कैसे करें?

मैं

page.response_headers['Content-Type'] 

की कोशिश की है लेकिन यह Capybara :: NotSupportedByDriverError अपवाद को जन्म देती है।

मैं भी कोशिश की है

page.driver.browser.switch_to.alert.text 

यह संदेश 'नहीं चेतावनी मौजूद है'

सराहना की किसी भी मदद के साथ विफल रहता है।

धन्यवाद।

+0

[ककड़ी परीक्षण फ़ाइल डाउनलोड] (के संभावित डुप्लिकेट http://stackoverflow.com/questions/5255250/cucumber -टेस्ट-फ़ाइल-डाउनलोड) – shingara

+0

हाँ दोस्त। अभी मैंने इसे http://stackoverflow.com/questions/5255250/cucumber-test-file-download/534130#answer-6533829 –

+0

द्वारा हल किया है मैंने rake_test ड्राइवर का उपयोग किया है और फ़ाइल डाउनलोड सुनिश्चित करने के लिए प्रतिक्रिया शीर्षकों का परीक्षण किया है। –

उत्तर

11

मैंने परीक्षण किया कि जब मैं एक लिंक पर क्लिक करता हूं तो मुझे * .pdf फ़ाइल प्राप्त करनी चाहिए।

click_on "link_to_pdf" 
page.response_headers['Content-Type'].should eq "application/pdf" 

यह सेलेनियम के साथ काम नहीं करता है, इसलिए जावास्क्रिप्ट ड्राइवर निर्दिष्ट करने के लिए बेहतर नहीं है। मुझे यकीन है कि यह रैकटेस्ट के साथ काम करता है।

feature "Download pdf", :js => false do 
end 
+0

वाह, सेटिंग 'जेएस: झूठी' काम किया! पर क्यों?? "यह सेलेनियम के साथ काम नहीं करता है", किसी को भी पता है क्यों, क्योंकि मुझे चलाने के लिए जेएस की जरूरत है! –

0

मैंने कुछ ऐसा करने और कई घंटों तक खर्च करने की कोशिश की है। अंत में मेरे पास कुछ समाधान है, शायद यह आपके लिए भी उपयुक्त है।

Gemfile:

#source 'https://rubygems.org' 

gem 'rails',     '4.2.2' 
gem 'bcrypt',     '3.1.7' 
gem 'bootstrap-sass',   '3.2.0.0' 
gem 'faker',     '1.4.2' 
gem 'carrierwave',    '0.10.0' 
gem 'mini_magick',    '3.8.0' 
gem 'fog',      '1.36.0' 
gem 'will_paginate',   '3.0.7' 
gem 'bootstrap-will_paginate', '0.0.10' 
gem 'sass-rails',    '5.0.2' 
gem 'uglifier',    '2.5.3' 
gem 'coffee-rails',   '4.1.0' 
gem 'jquery-rails',   '4.0.3' 
gem 'turbolinks',    '2.3.0' 
gem 'jbuilder',    '2.2.3' 
gem 'sdoc',     '0.4.0', group: :doc 
gem 'rename' 
gem 'sprockets',        '3.6.3' 
gem 'responders',   '~> 2.0' 
gem 'inherited_resources' 

group :development, :test do 
    gem 'sqlite3',  '1.3.9' 
    gem 'byebug',  '3.4.0' 
    gem 'web-console', '2.0.0.beta3' 
    gem 'spring',  '1.1.3' 
end 

group :test do 
    gem 'minitest-reporters', '1.0.5' 
    gem 'mini_backtrace',  '0.1.3' 
    gem 'guard-minitest',  '2.3.1' 
    gem 'capybara',   '2.8.1' 
    gem 'rspec',    '3.5.0' 
    gem 'rspec-rails',  '~> 3.4' 
    gem 'cucumber-rails', :require => false 
    gem 'shoulda-matchers', '~> 3.0', require: false 
    gem 'database_cleaner' 
    gem 'factory_girl_rails', '~> 4.5.0' 
end 

कल्पना/rails_helper.rb

ENV['RAILS_ENV'] ||= 'test' 
require File.expand_path('../../config/environment', __FILE__) 
abort("The Rails environment is running in production mode!") if Rails.env.production? 
require 'spec_helper' 
require 'rspec/rails' 

require 'shoulda/matchers' 

Shoulda::Matchers.configure do |config| 
    config.integrate do |with| 
    with.test_framework :rspec 
    with.library :rails 
    end 
end 

config.use_transactional_fixtures = false 

ActiveRecord::Migration.maintain_test_schema! 

RSpec.configure do |config| 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 

    config.use_transactional_fixtures = true 

    config.infer_spec_type_from_file_location! 

    config.filter_rails_from_backtrace! 
end 

कल्पना/spec_helper.rb

ENV["RAILS_ENV"] ||= 'test' 
require File.expand_path("../../config/environment", __FILE__) 
require 'rspec/rails' 

require 'capybara/rspec' 
require 'capybara/rails' 

require 'download_helper' 

Capybara.register_driver :selenium do |app| 
    profile = Selenium::WebDriver::Firefox::Profile.new 
    profile['browser.download.dir'] = DownloadHelpers::PATH.to_s 
    profile['browser.download.folderList'] = 2 

    profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/csv' 
    Capybara::Selenium::Driver.new(app, :browser => :firefox, :profile => profile) 
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 

    config.shared_context_metadata_behavior = :apply_to_host_groups 

    config.include Capybara::DSL 


=begin 
    config.filter_run_when_matching :focus 

    config.example_status_persistence_file_path = "spec/examples.txt" 

    config.disable_monkey_patching! 

    if config.files_to_run.one? 
    config.default_formatter = 'doc' 
    end 

    config.profile_examples = 10 

    config.order = :random 

    Kernel.srand config.seed 
=end 
end 

परीक्षा/test_helper.rb

ENV['RAILS_ENV'] ||= 'test' 
require File.expand_path('../../config/environment', __FILE__) 
require 'rails/test_help' 
require 'capybara/rails' 

class ActiveSupport::TestCase 
    # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 
    fixtures :all 
    include ApplicationHelper 

    def is_logged_in? 
     !session[:user_id].nil? 
    end 

    # Logs in a test user. 
    def log_in_as(user, options = {}) 
     password = options[:password] || 'password' 
     remember_me = options[:remember_me] || '1' 
     if integration_test? 
      post login_path, session: { email:user.email, password: password, remember_me: remember_me } 
     else 
      session[:user_id] = user.id 
     end 
    end 

    private 

     # Returns true inside an integration test. 
     def integration_test? 
      defined?(post_via_redirect) 
     end 

end 

class ActionDispatch::IntegrationTest 
    # Make the Capybara DSL available in all integration tests 
    include Capybara::DSL 

    # Reset sessions and driver between tests 
    # Use super wherever this method is redefined in your individual test classes 
    def teardown 
    Capybara.reset_sessions! 
    Capybara.use_default_driver 
    end 
end 

कल्पना/download_helper.rb

module DownloadHelpers 
    TIMEOUT = 1 
    PATH = Rails.root.join("tmp/downloads") 

    extend self 

    def downloads 
    Dir[PATH.join("*")] 
    end 

    def download 
    downloads.first 
    end 

    def download_content 
    wait_for_download 
    File.read(download) 
    end 

    def wait_for_download 
    Timeout.timeout(TIMEOUT) do 
     sleep 0.1 until downloaded? 
    end 
    end 

    def downloaded? 
    !downloading? && downloads.any? 
    end 

    def downloading? 
    downloads.grep(/\.part$/).any? 
    end 

    def clear_downloads 
    FileUtils.rm_f(downloads) 
    end 
end 

कल्पना/mpodels/spec.rb

describe 'Download file' do 

    specify do 
     visit '/createfile' 

     click_on 'create file' 

      page.response_headers['Content-Type'].should == "text/lfile" 
      header = page.response_headers['Content-Disposition'] 
      header.should match /^attachment/ 
      header.should match /filename=\"temp.txt\"$/ 
     end 
    end 
संबंधित मुद्दे