0

基本的に、この特定のテストが失敗する理由について、私は困惑しています。ページに入って手動でテストすると、ページは正常に機能しますが、テストは失敗し続けます。まず、ここにエラーがあります。

 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

どんなポインタでも大歓迎です!

4

0 に答える 0