次のモデルで 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)>'
何がこれを引き起こしているのかわからない...