1

以前は rspec がなかったプロジェクト、または自動化されたテストがまったくないプロジェクトに Rspec テストを追加しています。Windows 7ボックスで実行されています。rspec を実行すると、次のエラーが表示されます。

undefined method `has_attached_file'

主な問題は、Paperclip をまったく使用していないモデルの簡単なテストを書いていることです。ペーパークリップは別のモデルで使用されています。テスト環境に宝石を含めようとして、広範囲に調査しましたが、問題を解決するものは何もないようです。

rspec テストを実行するときに、ペーパークリップの組み込みをスキップまたは強制する方法はありますか?

私のgemfileには、とりわけ次のものがあります。

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

rspec コマンドを実行します。

bundle exec rake spec

次のエラーが表示されます。

    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'

私の spec_helper ファイルは次のとおりです。

# 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

これを適切に機能させるために何をすべきかについてのアイデアはありますか?

EDIT問題はspec_helper.rbをロードする前に発生するようです意図的にエラーを追加するなど、このファイルに変更を加えると、何も起こらず、上記の問題が発生し続けます。テストを実行する唯一の方法は、モデルの has_attached_file 行にコメントを付けて、Gemfile の paperclip gem に group オプションを追加して、テスト環境で使用しないようにすることです。

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

テスト環境から Paperclip をスキップせずにこれを解決する方法がわかりません。

4

2 に答える 2

4

問題はshoulda-matchersとpaperclipにあるようです

spec_helper.rb ファイルに追加します

require "paperclip/matchers"

あなたがいる場所の下

require "capybara/rspec"

そして追加

config.include Paperclip::Shoulda::Matchers

RSpec.configure do |config|    

paperclip のshoulda-matchers のドキュメントを確認してください

お役に立てれば

于 2013-10-31T18:31:18.227 に答える
0

Rails ではなく ActiveRecord を持つ gem で Paperclip を使用しようとしたときに、この問題に遭遇しました。spec/support/paperclip.rb次のファイルを追加することで、テスト用にこれを修正できました。

require 'paperclip/railtie'

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

これも示唆されているように、これは を追加するのに適した場所config.include Paperclip::Shoulda::Matchersです。

しかし、私は Rails 4.2 と Rspec 3 を使用しているため、ロードされる順序はあなたのものとはかなり異なると思います。

于 2015-07-17T23:10:10.143 に答える