2011-01-03 9 views
6

Tengo dificultades para obtener una prueba rspec para que pase un controlador. Me gustaría probar que el POST crear acción funciona. Estoy utilizando carriles (3.0.3), cancan (1.4.1), idear (1.1.5), rspec (2.3.0)No se puede probar con el controlador rspec POST crear acción (idear y cancan)

El modelo está muerto sencillo

class Account < ActiveRecord::Base 
    attr_accessible :name 
end 

El controlador es estándar así (directamente de andamios)

class AccountsController < ApplicationController 
    before_filter :authenticate_user!, :except => [:show, :index] 
    load_and_authorize_resource 
    ... 

    def create 
    @account = Account.new(params[:account]) 

    respond_to do |format| 
     if @account.save 
     format.html { redirect_to(@account, :notice => 'Account was successfully created.') } 
     format.xml { render :xml => @account, :status => :created, :location => @account } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @account.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

y la prueba rspec me gustaría transmitir es (con perdón del título, tal vez no sea el más apropiado)

it "should call create on account when POST create is called" do 
    @user = Factory.create(:user) 
    @user.admin = true 
    @user.save 

    sign_in @user #this is an admin 
    post :create, :account => {"name" => "Jimmy Johnes"} 
    response.should be_success 
    sign_out @user 

end 

Sin embargo, todo lo que consigo es

AccountsController get index should call create on account when POST create is called 
Failure/Error: response.should be_success 
expected success? to return true, got false 
# ./spec/controllers/accounts_controller_spec.rb:46 

Otras acciones pueden ser probados y no pasan (es decir, Tener nuevas)

aquí es la prueba para conseguir nuevos

it "should allow logged in admin to call new on account controller" do 
    @user = Factory.create(:user) 
    @user.admin=true 
    @user.save 

    sign_in @user #this is an admin 
    get :new 
    response.should be_success 
    sign_out @user 
end 

y para la terminación aquí es el archivo de la capacidad

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 
    if user.admin? 
     can :manage, :all 
    else 
     can :read, :all 
    end 
    end 
end 

¿Alguna idea? Supongo que estoy utilizando la expectativa rspec incorrecta, ya que el código funciona (¡simplemente es que la prueba no funciona como debiera!)

Respuesta

23

response.should be_success devuelve verdadero si el código de respuesta está en el rango 200-299. Pero la acción de crear redirige, por lo que el código de respuesta se establece en 302, por lo tanto, la falla.

Puede probar esto usando response.should redirect_to. Compruebe la salida del generador de controlador estándar RSpec por ejemplo, lo que podría tener este aspecto:

it "redirects to the created account" do 
    Account.stub(:new) { mock_account(:save => true) } 
    post :create, :account => {} 
    response.should redirect_to(account_url(mock_account)) 
    end 
+0

Zetetic tu respuesta fue excelente Tuve que hacer algunas tweeks para que pasara, pero la esencia era que debería haber sido una redirección. – Dimitris

+0

Creo que esta respuesta debería ser la respuesta aceptada. –

+0

He votado esto como la respuesta aceptada ya que la mayoría de las personas parecen encontrar esta respuesta la más útil – Dimitris

3

La prueba rspec que consiguió la prueba de pasar era (gracias a los consejos de Zetetic):

it "should call create on account when POST create is called" do 
    @user = Factory.create(:user) 
    @user.admin = true 
    @user.save 

    sign_in @user #this is an admin 
    account = mock_model(Account, :attributes= => true, :save => true) 
    Account.stub(:new) { account } 

    post :create, :account => {} 
    response.should redirect_to(account_path(account)) 
    sign_out @user 

end 
Cuestiones relacionadas