Ошибка rspec с созданием в контроллере - PullRequest
0 голосов
/ 21 сентября 2011

Вот ошибка в rspec:

CategoriesController GET 'update' should be successful
 Failure/Error: get 'update'
 ActiveRecord::RecordNotFound:
   Couldn't find Category without an ID
 # c:in `find'
 # ./app/controllers/categories_controller.rb:45:in `update'
 # ./spec/controllers/categories_controller_spec.rb:35:in `block (3 levels) in <top (required)>'

Вот код в контроллере:

  def edit
    @category = Category.find(params[:id])
  end

  def update
    @category = Category.find(params[:id])
    #@category.reload. caused nil.reload error

    if @category.update_attributes(params[:category], :as => :roles_update)  
      @category = Category.find(params[:id])
      redirect_to @category, :notice => 'Category was successfully updated'
    else
      @categories = Category.all
      render 'index'
    end 
  end

Вот код rspec:

  describe "GET 'update'" do
    it "should be successful" do
      get 'update'
      response.should be_success
    end
  end

Какие-нибудь мысли?Благодаря.

1 Ответ

1 голос
/ 21 сентября 2011

Вы вставили действие создания вместо действия обновления.Кроме того, вы пытаетесь протестировать действие обновления с помощью запроса get ... оно должно быть с запросом пут, если вы следуете соглашениям.

Если, например, действие обновления выполнено ... выбудет тестировать более или менее, как:

describe CategoriesController do
  let(:category) { mock_model(Category).as_null_object }

  describe "PUT update" do
    before do
      Category.should_receive(:find).with(5).and_return(category)
    end

    context "when a category updates succesfully" do
      before do
        category.stub(:update_attributes).and_return(true)
      end

      it "redirects to the categories page" do
        put :update, :id => 5, :category => { :some_val => 4 }
        response.should redirect_to(categories_path)
      end

      it "sets the flash message" do
        put :update, :id => 5, :category => { :some_val => 4 }
        flash[:notice].should eq("Category was succesfully updated")
      end
    end

    context "when a category does not update successfully" do
      before do
        category.stub(:update_attributes).and_return(false)
      end

      it "sets the flash message"
      it "redirects to the categories page"

      # etc etc
    end
  end
end

Чтобы добраться до этой точки (имеется в виду добавление фиктивных моделей, заглушки, что у вас есть), вы обычно начинаете «свежее», так сказать, и продвигаетесь вверхСтиль TDD.Надеюсь, это поможет

...