基本的に、この特定のテストが失敗する理由について、私は困惑しています。ページに入って手動でテストすると、ページは正常に機能しますが、テストは失敗し続けます。まず、ここにエラーがあります。
2) Setlist Pages Edit page adding a song
Failure/Error: click_button submit
ActionController::RoutingError:
No route matches {:action=>"edit", :controller=>"setlists", :id=>nil}
# ./app/controllers/allocations_controller.rb:15:in `create'
# (eval):2:in `click_button'
# ./spec/requests/setlist_pages_spec.rb:79:in `block (4 levels) in <top (required)>'
id が nil に設定されていることはわかっていますが、テストが最初にページにアクセスしたときに、コンテンツのテストがパスするためレンダリングされることはわかっています。編集アクションもテストしているときに、作成コントローラーを指している理由がわかりません。テストを以下に示します。
before do
@setlist = Setlist.create(date: Date.today, morning: true)
end
...
describe "Edit page" do
let(:admin) { FactoryGirl.create(:admin) }
let(:submit){ "Add Song" }
before do
@secondSong = FactoryGirl.create(:song)
sign_in admin
visit edit_setlist_path(@setlist)
end
it{ should have_content("Edit a Setlist")}
describe "adding a song" do
before do
select("#{@secondSong.title} by #{@secondSong.artist}", from: 'Songs')
click_button submit
end
it{ should have_selector('div.alert.alert-success')}
it "should create a new allocation" do
expect{click_button submit}.to change(Allocation, :count).by(1)
end
end # end adding a song
end # end edit test
要求されたコントローラ コード:
def create
@setlist = Setlist.new(params[:setlist])
if @setlist.save
#success!
flash[:success] = "Setlist saved"
#@setlist.allocations.build produce invalid allocation with nil id
redirect_to setlist_path(@setlist)
else
#FAIL!
render 'new'
end
end
def edit
@songs= Song.search(params[:search])
#@songs = Song.all(order: 'title')
@setlist = Setlist.find(params[:id])
@allocations = @setlist.allocations
@allocation = Allocation.new
@selections = Song.all.collect {|s| [ [s.title, s.artist].join(" by "), s.id ]}
end
def update
@setlist = Setlist.find(params[:id])
@selections = Song.all.collect {|s| [ [s.title, s.artist].join(" by "), s.id] }
@allocations = @setlist.allocations
@allocation = Allocation.new
#Allocation parameters
@allocation.song_id = params[:allocation][:song_id]
@allocation.setlist_id = @setlist.id
@allocation.songPosition = @setlist.songs.count + 1
if @setlist.update_attributes(params[:setlist])
if @allocation.save
flash[:success] = "SETLIST SAVED!"
redirect_to edit_setlist_path(@setlist)
else
flash[:fail] = "Sorry there was an error adding songs to the setlist"
render 'edit'
end
else
flash[:fail] = "Invalid Set"
render 'edit'
end
end
どんなポインタでも大歓迎です!