2010-09-28 8 views
14

Im tratando de probar una condición en la que el registro exitoso de una plantilla de éxito se representa por el siguiente código de controlador deplantillas de prueba RSpec que se queden


def create 
    @user = User.new(params[:user]) 
    if @user.save 
     render :template => "success" 
    else 
     flash[:notice] = "Oops Somethings not quite right! :(" 
     render :action => "new" 
    end 
    end 
 

estoy usando la especificación siguiente para probar el código


before(:each) do 
    @user = User.new 
    @user.attributes = valid_attributes  
    @params = valid_attributes 
    @user.stub!(:save).and_return(true) 
    end 


    def do_post 
    post :create 
    end 


    it "should create new user " do 
    count = User.count 
    do_post 
    user = User.new(@params)  
    user.save.should eql(true) 
    User.count.should eql(count + 1) 

    end 

    it "should render the success page on successful signup" do 
    do_post 
    @user.save 
    response.should render_template("success") if @user.save 
    end 

Pero el ejemplo no "debe rendir el éxito en la página de registro de éxito", con este mensaje de error


1) 
'UsersController handling POST /users should render the success page on successful signup' FAILED 
expected "success", got "users/new.html.erb" 
./spec/controllers/users_controller_spec.rb:67: 
 

La vista de éxito es una plantilla almacenada en las vistas/usuarios/sin una acción. Supongo que estoy cometiendo un error muy fundamental y me gustaría algo de ayuda.

+0

que eliminaría la estado de usuario.guardado en su último afirmación – Rimian

Respuesta

24

Está anotando la variable @user en la prueba, pero el controlador instanciará una nueva instancia para que el stub no esté en su lugar.

No es una buena idea usar un stub en este caso solo para emular una llamada guardada exitosa. ¿Por qué no proporciona datos válidos en su lugar y se asegura de que la acción sea exitosa? El código siguiente es para RSpec> 2.1 y utiliza la sintaxis expect.

before(:each) do 
    @params = valid_attributes 
end 

it "should create new user" do 
    @_before = User.count 
    post :create, :user => @params 

    expect(assigns(:user)).to_not be_new_record 
    expect(User.count).to eq(@_before + 1) 
end 

it "should render the success page on successful signup" do 
    post :create, :user => @params 

    expect(response).to be_successful 
    expect(response).to render_template("success") 
end 

Por último, el cambio

render :template => "success" 

a

render :action => "success" 

Para versiones anteriores RSpec o si usted tiene que utilizar la sintaxis should, utilice

before(:each) do 
    @params = valid_attributes 
end 

it "should create new user" do 
    @_before = User.count 
    post :create, :user => @params 

    assigns(:user).should_not be_new_record 
    User.count.should == (@_before + 1) 
end 

it "should render the success page on successful signup" do 
    post :create, :user => @params 

    response.should be_successful 
    response.should render_template("success") 
end 
+1

Eso fue todo. Lo acabo de obtener. Gracias. Todavía estoy en proceso de entender el trabajo con Rspec. Muchas gracias. – Sid

Cuestiones relacionadas