0

次のモデルで rspec テストを実行できません。

class Sound < ActiveRecord::Base
  belongs_to :user

  # for paperclip
  has_attached_file :sound_file

  # do not create a sound unless a sound file
  # is present
 validates_attachment_presence :sound_file
end

具体的には、作成ルートをテストしようとしています。私のコントローラーから:

def create
    @sound = Sound.create( sound_params )
    redirect_to sound_url(@sound)
end

private

def sound_params
   params.require(:sound).permit(
     :sound_file,
     :sound_name,
     :description,
     :location)
end

これが私が最初に sound_controller_spec.rb ファイルに書いたものです:

   describe "POST #create" do

     it 'creates a new sound' do 
       tester_sound = FactoryGirl.create(:sound,
                                     :sound_name => 'test',
                                     :sound_file => File.open('/Users/christopherspears/wdi/83746__braffe2__pen-writing.wav'))
       post :create, sound: tester_sound
       expect(Sound.last.sound_name).to eq(tester_sound[:sound_name])
     end
  end

次のエラー メッセージが表示されました。

  1) SoundsController POST #create creates a new sound
     Failure/Error: post :create, sound: tester_sound
     NoMethodError:
       undefined method `permit' for "54":String
       # ./app/controllers/sounds_controller.rb:53:in `sound_params'
       # ./app/controllers/sounds_controller.rb:16:in `create'
       # ./spec/controllers/sounds_controller_spec.rb:39:in `block (3 levels) in <top     (required)>'

奇妙なことに、「54」は次のファイル パスに何らかの形で接続されていると思います: /Users/christopherspears/wdi/HearHere/public/system/sounds/sound_files/000/000/054/original/83746_ braffe2 _pen-writing.wav

同僚は、Sound のパラメーターを含むハッシュをテストに渡すことを提案しました。

describe "POST #create" do 
    it 'creates a new sound' do 
      tester_hash = {:sound_name => 'test',
                     :sound_file =>  File.open('/Users/christopherspears/wdi/83746__braffe2__pen-writing.wav')}
    post :create, sound: tester_hash
    expect(Sound.last.sound_name).to eq(tester_hash[:sound_name])
   end
end

残念ながら、別のエラーが発生しました。

Failures:

  1) SoundsController POST #create creates a new sound
     Failure/Error: post :create, sound: tester_hash
     Paperclip::AdapterRegistry::NoHandlerError:
       No handler found for "#<File:0x007ff603de0868>"
     # ./app/controllers/sounds_controller.rb:16:in `create'
    # ./spec/controllers/sounds_controller_spec.rb:48:in `block (3 levels) in <top (required)>'

私はルートで何か変わったことをしているとは思わない:

get 'sounds/:id/download' => 'sounds#download', :as => :download
resources :sounds

何かアドバイス?validates_attachment_presence を使用してモデルのコントローラーをテストするのは少し難しいようです。

アップデート

今は別の方法を試しています。

let(:valid_attributes) { { "sound_name" => "test", "sound_file" => File.new } }
let(:valid_session) { {} }

describe "POST #create" do 
    it 'creates a new sound' do
      sound = FactoryGirl.create(:sound => valid_attributes)
      expect { sound.sound_name }.to eq("test")
    end
end

少なくとも、別のエラー メッセージが表示されます。

失敗:

  1) SoundsController POST #create creates a new sound
     Failure/Error: let(:valid_attributes) { { "sound_name" => "test", "sound_file" => File.new } }
     ArgumentError:
       wrong number of arguments (0 for 1..3)
       # ./spec/controllers/sounds_controller_spec.rb:4:in `initialize'
       # ./spec/controllers/sounds_controller_spec.rb:4:in `new'
       # ./spec/controllers/sounds_controller_spec.rb:4:in `block (2 levels) in <top (required)>'
       # ./spec/controllers/sounds_controller_spec.rb:38:in `block (3 levels) in <top (required)>'

何がこれを引き起こしているのかわからない...

4

1 に答える 1

0

postnil次のように、パラメーターがハッシュまたは文字列であると想定しています( https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/test_case.rbから取得)。これは、最初のアプローチの理由を説明していますうまくいきませんでした。

  # Simulate a GET request with the given parameters.
  #
  # - +action+: The controller action to call.
  # - +parameters+: The HTTP parameters that you want to pass. This may
  #   be +nil+, a hash, or a string that is appropriately encoded
  #   (<tt>application/x-www-form-urlencoded</tt> or <tt>multipart/form-data</tt>).
  # - +session+: A hash of parameters to store in the session. This may be +nil+.
  # - +flash+: A hash of parameters to store in the flash. This may be +nil+.
  #
  # You can also simulate POST, PATCH, PUT, DELETE, HEAD, and OPTIONS requests with
  # +post+, +patch+, +put+, +delete+, +head+, and +options+.
  #
  # Note that the request method is not verified. The different methods are
  # available to make the tests more expressive.
  def get(action, *args)
    process(action, "GET", *args)
  end

  # Simulate a POST request with the given parameters and set/volley the response.
  # See +get+ for more details.
  def post(action, *args)
    process(action, "POST", *args)
  end

2番目のアプローチについては、 https://stackoverflow.com/a/11108270/1008891で説明されているように、Paperclip:sound_fileがのインスタンスになることを期待しているため、失敗していると思いますActionDispatch::Http::UploadedFile

于 2013-11-14T18:51:30.003 に答える