2010-09-28 63 views
14

我试着去测试,其中在成功注册成功的模板由以下控制器代码Rspec的测试模板被渲染


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 
 

我使用以下规范来测试这个代码


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 
渲染的条件

但这个例子失败“它应该在成功注册成功渲染页面”与此错误消息


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: 
 

成功视图是存储在views/users /中的模板,无需执行任何操作。我猜我即将犯一个非常根本的错误,并希望得到一些帮助。

+0

我会删除user.save条件最后一个断言。 – Rimian 2013-04-15 02:27:23

回答

24

您正在测试@user变量,但控制器将实例化一个新实例,因此该存根将不会到位。

在这种情况下使用存根不是一个好主意,只是为了模拟成功的保存调用。你为什么不提供有效的数据,并确保行动是成功的?

以下代码适用于RSpec> 2.1并且它使用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 

最后,改变

render :template => "success" 

render :action => "success" 

对于以前的RSpec版本,或者如果你有使用should语法,使用

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

就是这样。我刚刚得到它。谢谢。我仍然在与Rspec合作的过程中。非常感谢你。 – Sid 2010-09-28 09:01:10