Тестирование Rails 3 response_with с RSpec - PullRequest
4 голосов
/ 15 августа 2011

Я недавно изменил код моего контроллера с:

  def create
    @checklist_item = @checklist.items.build(params[:checklist_item])
    if @checklist_item.save
      flash[:notice] = "Successfully created checklist item."
      redirect_to checklist_item_url(@checklist, @checklist_item)
    else
      render :action => 'new'
    end
  end

до

  respond_to :html, :json
  def create
    @checklist_item = @checklist.items.build(params[:checklist_item])
    if @checklist_item.save
      flash[:notice] = "Successfully created checklist item."
    end
    respond_with @checklist_item
  end

Но моя спецификация, которая хорошо работала с моим предыдущим кодом контроллера, не работает:

  it "create action should render new template when model is invalid" do
    checklist_item.stub(:valid? => false)
    checklist.stub_chain(:items, :build => checklist_item)
    post :create, :checklist_id => checklist.id
    response.should render_template(:new)
  end

с ошибкой:

1) Checklists::ItemsController create action should render new template when model is invalid
     Failure/Error: response.should render_template(:new)
     MiniTest::Assertion:
       Expected block to return true value.

Я не уверен, как изменить спецификацию. Все по-прежнему работает так же, когда я тестирую его в браузере (он отображает новый).

Ответы [ 2 ]

1 голос
/ 23 января 2012

Причина в том, что responseds_with проверяет .errors.empty?, а не valid? (я полагаю, он не хочет без необходимости повторно запускать проверки). Так что заглушить .errors Я думаю.

1 голос
/ 16 августа 2011

Довольно забавно, только что попробовал и действительно response не содержит много.

Это простой статус 302. Тест: response.status.should eq 302

С таким телом, как:

"<html><body>You are being <a href=\"new_url">redirected</a>.</body></html>"

, что тоже легко проверяется.

Я буду копать немного дальше.


Edit:

Даже с render_views, response остается простым перенаправлением.

Вы также можете проверить response.header, который выглядит так:

{"Location"=>"http://test.host/users", "Content-Type"=>"text/html; charset=utf-8"}
...