Excuses d'avance pour la verbosité de cette question. Si vous supportez avec moi, je pense que vous trouverez que c'est en fait assez simple ... juste difficile pour moi d'expliquer, compte tenu de ma connaissance limitée du domaine Rails.Utilisation et test des rails ActionController's response_with
Donné ce commentaire dans an ActionController commit dated Aug 6:
=== Builtin HTTP verb semantics
Rails default renderer holds semantics for each HTTP verb. Depending on the
content type, verb and the resource status, it will behave differently.
Using Rails default renderer, a POST request for creating an object could
be written as:
def create
@user = User.new(params[:user])
flash[:notice] = 'User was successfully created.' if @user.save
respond_with(@user)
end
Which is exactly the same as:
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
flash[:notice] = 'User was successfully created.'
format.html { redirect_to(@user) }
format.xml { render :xml => @user, :status => :created, :location => @user }
else
format.html { render :action => "new" }
format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
end
end
end
The same happens for PUT and DELETE requests.
J'ai modifié un contrôleur très simple à utiliser respond_with
. Tout semble fonctionner correctement, sauf 2 spécifications échouent lorsque les tests Rails auto-générés tentent de passer vide params
pour mettre à jour & créer des méthodes. Je peux corriger ce comportement avec un simple si save/else MAIS j'essaye de comprendre cette "nouvelle" fonctionnalité. Je pense que la spécification par défaut peut éventuellement être écrite de manière obsolète.
De COMMIT commentaires: « Since the request is a POST, respond_with will check wether @people resource have errors or not. If it has errors, it will render the error object with unprocessable entity status (422).
»
Ainsi, le défilement vers le bas pour le dernier test/spec sous POST (ci-dessous) que je pourrais être réécrivant que de telle sorte qu'il teste « le statut d'entité non traitable (422) "et passe et ainsi tout est peachy-désireux?
Mon contrôleur:
class ClownsController < ApplicationController
respond_to :html, :json
def index
respond_with(@clowns = Clown.all)
end
def show
respond_with(@clown = Clown.find(params[:id]))
end
def new
respond_with(@clown = Clown.new)
end
def edit
respond_with(@clown = Clown.find(params[:id]))
end
def create
@clown = Clown.new(params[:clown])
flash[:notice] = 'Clown was successfully created.' if @clown.save
respond_with(@clown)
end
# Replacing def create above with this won't Fail the speC##
#
# def create
# @clown = Clown.new(params[:clown])
# respond_with(@clown) do |format|
# if @clown.save
# flash[:notice] = 'Clown was successfully created.'
# format.html { redirect_to @clown }
# else
# format.html { render :action => :new }
# end
# end
# end
def update
@clown = Clown.find(params[:id])
flash[:notice] = 'Clown has been updated.' if @clown.update_attributes(params[:clown])
respond_with(@clown)
end
def destroy
@clown = Clown.find(params[:id])
flash[:notice] = 'Successfully deleted clown.' if @clown.destroy
respond_with(@clown)
end
end
Test des spécifications:
$ rspec spec/
.......F....F..............
Failures:
1) ClownsController POST create with invalid params re-renders the 'new' template
Failure/Error: response.should render_template("new")
expecting <"new"> but rendering with <"">.
Expected block to return true value.
# (eval):2:in `assert_block'
# ./spec/controllers/clowns_controller_spec.rb:69:in `block (4 levels) in <top (required)>'
2) ClownsController PUT update with invalid params re-renders the 'edit' template
Failure/Error: response.should render_template("edit")
expecting <"edit"> but rendering with <"">.
Expected block to return true value.
# (eval):2:in `assert_block'
# ./spec/controllers/clowns_controller_spec.rb:107:in `block (4 levels) in <top (required)>'
Voici une partie de clowns_controller_spec.rb:
require 'spec_helper'
describe ClownsController do
def mock_clown(stubs={})
(@mock_clown ||= mock_model(Clown).as_null_object).tap do |clown|
clown.stub(stubs) unless stubs.empty?
end
end
...
describe "POST create" do
describe "with invalid params" do
it "re-renders the 'new' template" do
Clown.stub(:new) { mock_clown(:save => false) }
post :create, :clown => {}
response.should render_template("new")
end
end
revoir ce problème ... et je ne sais toujours pas ce qui se passe ... alors je n'ai pas passé les tests de problèmes ... évidemment pas l'idéal. – Meltemi
https://github.com/rspec/rspec-rails/issues/103 – scragz