简体   繁体   中英

Issue with Paperclip and Rspec: undefined method `has_attached_file'

I'm adding Rspec tests to a project that didn't have rspec before, or automated tests at all. It is running on a Windows 7 box. When I run rspec, it shows the error:

undefined method `has_attached_file'

The main issue is that I'm writing just a simple test for a model that is not using Paperclip at all. Paperclip is used on another model. I've researched extensively, trying to include the gem in test environment but nothing seems to solve the issue.

Is there a way of skipping or forcing the inclussion of paperclip when I run the rspec tests?

My gemfile has, among other things, the following:

source 'http://rubygems.org'
ruby "1.9.2"
gem 'rails', '3.0.20'
...
gem "paperclip", :git => 'git://github.com/thoughtbot/paperclip.git'
gem 'aws-s3'
gem 'aws-sdk'
group :test, :development do
  gem 'rspec-rails', '~> 2.14.0'
end
group :test do
  gem 'sqlite3'
  gem 'capybara', '2.0'
  gem 'selenium-webdriver'
  gem 'shoulda-matchers'
  gem 'database_cleaner'
  gem 'launchy', '2.2.0'
  gem 'factory_girl_rails'
end

I run the rspec command:

bundle exec rake spec

I get the following error:

    C:/Users/MAC/.pik/rubies/Ruby-192-p290/bin/ruby.exe -S rspec ./spec/models/filter_category_spec.rb ./spec/models/filter_spec.rb
C:/Users/MAC/.pik/rubies/Ruby-192-p290/lib/ruby/gems/1.9.1/gems/attr_encrypted-1.2.1/lib/attr_encrypted.rb:241:in `method_missing': undefined method `has_a
ttached_file' for #<Class:0x5278770> (NoMethodError)
        from C:/Users/MAC/.pik/rubies/Ruby-192-p290/lib/ruby/gems/1.9.1/gems/activerecord-3.0.20/lib/active_record/base.rb:1018:in `method_missing'
        from C:/Users/MAC/.pik/rubies/Ruby-192-p290/lib/ruby/gems/1.9.1/gems/attr_encrypted-1.2.1/lib/attr_encrypted/adapters/active_record.rb:50:in `metho
d_missing_with_attr_encrypted'
....
       from C:/Users/MAC/.pik/rubies/Ruby-192-p290/lib/ruby/gems/1.9.1/gems/railties-3.0.20/lib/rails/application.rb:77:in `method_missing'
       from C:/Avity/DS Candidates Tracking System/ds-cts/config/environment.rb:5:in `<top (required)>'
       from C:/Avity/DS Candidates Tracking System/ds-cts/spec/spec_helper.rb:3:in `require'
       from C:/Avity/DS Candidates Tracking System/ds-cts/spec/spec_helper.rb:3:in `<top (required)>'
       from C:/Avity/DS Candidates Tracking System/ds-cts/spec/models/filter_category_spec.rb:1:in `require'

My spec_helper file is:

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'capybara/rspec'

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  config.use_transactional_fixtures = false
  config.infer_base_class_for_anonymous_controllers = false
  config.order = "random"

  #Database cleaner
  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

  #Use chrome driver
  Capybara.register_driver :selenium do |app|
      Capybara::Selenium::Driver.new(app, :browser => :chrome)
    end
    Capybara.current_driver = :selenium_chrome
end

Any ideas of what should I do to make this work properly?

EDIT It seems the issue comes before loading spec_helper.rb If I make changes on this file, like adding errors on purpose, nothing happens and the issue above keeps happening. The only way I have to run the tests is by commenting the has_attached_file line on my model and adding the group option to the paperclip gem on my Gemfile, to avoid having it on test environment:

gem "paperclip", :git => 'git://github.com/thoughtbot/paperclip.git', :group=>[:development,:production]

Not sure how to solve this without skipping Paperclip from test env.

The problem seems to me to be with shoulda-matchers and paperclip

Add to your spec_helper.rb file

require "paperclip/matchers"

below where you are

require "capybara/rspec"

And add

config.include Paperclip::Shoulda::Matchers

below

RSpec.configure do |config|    

Check out the shoulda-matchers documentation for paperclip

Hope this helps

I ran into this issue when trying to use Paperclip in a gem that has ActiveRecord, but not Rails. I was able to fix this for tests by adding a spec/support/paperclip.rb file with the following:

require 'paperclip/railtie'

RSpec.configure do |config|
  # Bind paperclip to enable ActiveRecord #has_attached_file method
  Paperclip::Railtie.insert
end

As also suggested, this is a good place to add config.include Paperclip::Shoulda::Matchers .

But I'm using Rails 4.2 and Rspec 3, so I think the order of things loaded is much different than yours.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM